HSM技术精讲(3.8):证书对象——数字世界的“身份证明“ 3.8 证书对象数字世界的身份证明本文内容摘自本人的开源书《HSM技术书 - 从思想实验到安全基石》 在线阅读/下载hsm-bookgitclone https://github.com/Lularible/hsm-book.git⭐ 如果对您有帮助欢迎 Star 支持也欢迎通过 GitHub Issues 交流讨论。证书对象概述PKCS#11规范第4.6节定义了证书对象CKO_CERTIFICATE用于存储公钥证书和属性证书。证书对象分类 CKO_CERTIFICATE证书对象类 ├── CKC_X_509 X.509公钥证书最常用 ├── CKC_WTLS WTLS公钥证书移动设备 └── CKC_X_509_ATTR_CERT X.509属性证书Cryptoki的态度规范明确指出——“Cryptoki不赋予证书任何特殊意义”。证书对象只是一个存储容器PKCS#11不负责验证证书有效性、不检查证书链、不解析证书内容。这些工作由应用程序完成。这体现了PKCS#11只提供机制不提供策略的设计哲学。证书对象的通用属性所有证书对象共享以下属性属性数据类型含义CKA_CERTIFICATE_TYPECK_CERTIFICATE_TYPE证书类型CKC_X_509等CKA_TRUSTEDCK_BBOOL证书是否可信仅SO可设置CKA_CERTIFICATE_CATEGORYCK_CERTIFICATE_CATEGORY证书类别用户证书/CA证书/其他CKA_CHECK_VALUEByte array校验值SHA-1的前3字节CKA_START_DATECK_DATE证书起始日期仅参考CKA_END_DATECK_DATE证书终止日期仅参考CKA_PUBLIC_KEY_INFOByte arraySubjectPublicKeyInfo的DER编码关键约束CKA_CERTIFICATE_TYPE创建后不可修改CKA_TRUSTED只能由SO或Token初始化程序设置为CK_TRUE可信证书不可修改CKA_CERTIFICATE_CATEGORY创建后不可修改CKA_CHECK_VALUE SHA-1(CKA_VALUE)的前3字节CKA_CERTIFICATE_CATEGORY证书的三种角色这个属性标识证书的身份角色证书类别 CK_CERTIFICATE_CATEGORY_UNSPECIFIED 未指定默认 CK_CERTIFICATE_CATEGORY_TOKEN_USER 用户证书对应私钥在Token上 CK_CERTIFICATE_CATEGORY_AUTHORITY CA证书签发者证书 CK_CERTIFICATE_CATEGORY_OTHER_ENTITY 其他实体证书用途帮助应用程序区分证书用途。Token User表示该证书对应的私钥存在于此Token可用于签名/解密Authority表示这是一个CA证书可用于验证其他证书Other Entity表示第三方证书没有对应私钥X.509公钥证书对象最常用的证书类型CKC_X_509存储标准的X.509公钥证书。专属属性属性数据类型含义CKA_SUBJECTByte array证书主体的DER编码必须CKA_IDByte array密钥标识符关联公私钥CKA_ISSUERByte array签发者的DER编码CKA_SERIAL_NUMBERByte array序列号CKA_VALUEByte array证书BER编码必须CKA_URLRFC2279 string证书URLVALUE为空时使用CKA_HASH_OF_SUBJECT_PUBLIC_KEYByte array主体公钥的哈希CKA_HASH_OF_ISSUER_PUBLIC_KEYByte array签发者公钥的哈希创建示例CK_OBJECT_CLASS classCKO_CERTIFICATE;CK_CERTIFICATE_TYPE certTypeCKC_X_509;CK_UTF8CHAR label[]Server Certificate;CK_BYTE subject[]{...};// DER编码的主体名CK_BYTE id[]{0x01};// 与公钥/私钥共享的IDCK_BYTE certificate[]{...};// BER编码的完整证书CK_BBOOL trueCK_TRUE;CK_ATTRIBUTE template[]{{CKA_CLASS,class,sizeof(class)},{CKA_CERTIFICATE_TYPE,certType,sizeof(certType)},{CKA_TOKEN,true,sizeof(true)},{CKA_LABEL,label,sizeof(label)-1},{CKA_SUBJECT,subject,sizeof(subject)},{CKA_ID,id,sizeof(id)},{CKA_VALUE,certificate,sizeof(certificate)}};CK_OBJECT_HANDLE hCert;rvC_CreateObject(hSession,template,7,hCert);CKA_ID密钥与证书的纽带CKA_ID是连接公钥、私钥、证书三者的关键属性。理想关联关系 ┌───────────────────┐ │ X.509证书对象 │ CKA_ID 0x01 │ CKA_SUBJECT │ │ CKA_VALUE │ └───────────────────┘ │ │ CKA_ID相同 ▼ ┌───────────────────┐ │ 公钥对象 │ CKA_ID 0x01 │ CKA_CLASS │ │ CKO_PUBLIC_KEY │ └───────────────────┘ │ │ CKA_ID相同 ▼ ┌───────────────────┐ │ 私钥对象 │ CKA_ID 0x01 │ CKA_CLASS │ │ CKO_PRIVATE_KEY │ │ CKA_SENSITIVETRUE│ └───────────────────┘规范建议同一主体的公钥、私钥、证书应该使用相同的CKA_ID值方便应用程序查找关联对象。实际约束Cryptoki不强制这种关联也不强制CKA_ID的唯一性。应用程序需要自行维护这种关联关系。CKA_URL移动设备的轻量存储当证书较大时可以选择存储URL而非证书本身CK_ATTRIBUTE template[]{{CKA_CLASS,class,sizeof(class)},{CKA_CERTIFICATE_TYPE,certType,sizeof(certType)},{CKA_SUBJECT,subject,sizeof(subject)},{CKA_URL,https://ca.example.com/certs/server.der,36},{CKA_HASH_OF_SUBJECT_PUBLIC_KEY,hash,sizeof(hash)}};适用场景移动设备存储空间有限证书需要动态更新证书存储在外部服务器约束CKA_VALUE和CKA_URL不能同时为空至少要有一个。X.509属性证书对象属性证书CKC_X_509_ATTR_CERT不是公钥证书而是绑定属性到主体的证书。公钥证书 vs 属性证书 X.509公钥证书CKC_X_509 ├── 主体Subject DN ├── 公钥RSA/ECDSA等 ├── 签发者Issuer DN └── 用途证明我是谁身份认证 X.509属性证书CKC_X_509_ATTR_CERT ├── 主体Owner不同于Subject ├── 属性角色、权限、组等 ├── 签发者AC Issuer └── 用途证明我能做什么授权专属属性属性数据类型含义CKA_OWNERByte array属性证书主体的DER编码必须CKA_AC_ISSUERByte array属性签发者的DER编码CKA_SERIAL_NUMBERByte array序列号CKA_ATTR_TYPESByte array属性类型OID序列CKA_VALUEByte array属性证书BER编码必须注意CKA_OWNER与CKA_SUBJECT使用不同的ASN.1语法这是规范明确区分的。WTLS证书对象WTLS证书CKC_WTLS来自无线传输层安全协议用于移动设备环境。WTLS vs X.509 WTLS证书特点 - 编码格式更紧凑适合移动设备 - Subject/Issuer使用WTLS特有的Identifier编码 - 与X.509证书的ASN.1语法不同 适用场景 - WAP移动设备 - 资源受限环境CKA_TRUSTED信任锚点CKA_TRUSTED CK_TRUE表示此证书被信任为根证书Trust Anchor。安全约束应用程序不能将CKA_TRUSTED设置为CK_TRUE只有SOSecurity Officer或Token初始化程序可以设置可信证书不可被修改/* 应用程序尝试设置CKA_TRUSTED会失败 */CK_BBOOL trustedCK_TRUE;CK_ATTRIBUTE template[]{{CKA_TRUSTED,trusted,sizeof(trusted)}};rvC_CreateObject(hSession,template,1,hCert);// 返回CKR_ATTRIBUTE_READ_ONLY或CKR_USER_NOT_LOGGED_IN设计意图防止恶意应用程序植入假信任锚点。只有Token管理员才能决定哪些证书是可信的。证书对象在车载HSM中的应用车载HSM常见的证书对象配置车载证书存储方案 ┌─────────────────────────────────────┐ │ TokenHSM安全存储区 │ │ │ │ ┌───────────────┐ │ │ │ CA根证书 │ CKA_TRUSTEDTRUE│ │ │ CKA_CATEGORY │ AUTHORITY │ │ │ CKA_ID 0xFF │ (不可修改) │ │ └───────────────┘ │ │ │ │ ┌───────────────┐ │ │ │ 设备证书 │ CKA_TRUSTEDFALSE│ │ │ CKA_CATEGORY │ TOKEN_USER │ │ │ CKA_ID 0x01 │ (关联私钥) │ │ └───────────────┘ │ │ │ │ │ │ CKA_ID关联 │ │ ▼ │ │ ┌───────────────┐ │ │ │ 设备私钥 │ CKA_ID 0x01 │ │ │ CKA_SENSITIVE │ TRUE │ │ │ CKA_SIGN │ TRUE │ │ └───────────────┘ │ └─────────────────────────────────────┘典型应用场景安全启动Boot ROM验证固件签名证书链车载通信V2X通信使用设备证书签名消息诊断认证UDS 27服务验证诊断仪证书小结证书对象的设计智慧证书对象的设计体现了PKCS#11的核心哲学设计要点回顾 1. 只存储不验证 - Cryptoki不验证证书有效性 - 不检查证书链 - 不解析证书内容 - 应用程序负责这些工作 2. 信任锚点需要管理员授权 - CKA_TRUSTED只能由SO设置 - 防止应用程序植入假信任锚 - 体现硬件安全模块的信任根定位 3. 灵活的存储方式 - 可以存储完整证书CKA_VALUE - 可以只存储URLCKA_URL - 适应不同设备的存储约束 4. 清晰的关联机制 - CKA_ID连接公钥、私钥、证书 - 不强制但建议应用程序维护关联证书对象为PKCS#11提供了身份证明的存储能力而真正使用证书进行安全操作签名、验证则需要对应的密钥对象。下一节我们将了解硬件特性对象——看时钟、计数器等特殊对象。【下集预告】HSM有哪些特殊对象时钟对象有什么用单调计数器是什么用户界面对象怎么工作下一节硬件特征对象。