如何通过OpenSSL获取CMS_SignerInfo中完整的SignerIdentifier的ASN.1结构?
OpenSSL获取完整SignerIdentifier ASN.1结构的方法
OpenSSL提供了直接获取完整SignerIdentifier ASN.1结构的方法,无需手动拼接单个元素:
- 对于OpenSSL 1.1.0及以上版本,可直接调用
CMS_SignerInfo_get0_signer_id_asc()函数,它会返回包含颁发者与序列号(或密钥ID)的完整SignerIdentifierASN.1结构。该结构对应ASN.1定义中的CHOICE类型,会根据实际签名者标识类型返回对应内容。 - 若使用的是1.1.0之前的旧版本OpenSSL,则没有现成的直接获取方法,需要通过
CMS_SignerInfo_get0_signer_id()分别提取issuer和sno,再调用ASN1_item_new()、X509_NAME_dup()、ASN1_INTEGER_dup()等API手动构建SignerIdentifier的ASN.1结构。
以下是基于OpenSSL 1.1.0+的示例代码:
// 假设已获取有效的CMS_SignerInfo指针si ASN1_TYPE *signer_id = CMS_SignerInfo_get0_signer_id_asc(si); if (signer_id != NULL) { // 将完整的SignerIdentifier序列化为DER格式 unsigned char *der_data = NULL; int der_len = ASN1_item_i2d((ASN1_VALUE *)signer_id, &der_data, ASN1_ITEM_rptr(SignerIdentifier)); // 处理序列化后的DER数据... // 记得释放内存 OPENSSL_free(der_data); }
注意:
SignerIdentifier的ASN.1定义是CHOICE类型,包含issuerAndSerialNumber和subjectKeyIdentifier两种选项,CMS_SignerInfo_get0_signer_id_asc()会自动返回匹配当前签名者标识的完整结构。
内容的提问来源于stack exchange,提问作者tzippy
相关产品推荐
相关产品推荐

