使用OpenSSL代码为CRL添加CRL number扩展失败如何解决
问题原因
你的代码有三处核心问题导致CRL Number扩展添加失败:
- 声明的
lhash_st_CONF_VALUE conf未初始化就传入X509V3_EXT_conf_nid,干扰了扩展解析逻辑,该参数在无自定义配置的场景下直接传NULL即可。 - 未判断
X509V3_EXT_conf_nid的返回值,扩展创建失败时没有感知路径。 X509_CRL_add_ext添加完扩展后,你没有释放原扩展对象,存在内存泄漏的同时部分低版本OpenSSL会因此出现异常。
修复方案
方案1:通用扩展函数修复
直接修改SetCrlExtension函数即可兼容所有扩展添加逻辑:
INT16 SetCrlExtension(UINT16 issuerCertificateIndex, INT16 extensionNid, const char* extensionData) { X509V3_CTX ctx; X509_EXTENSION* extension; int result = 1; X509V3_set_ctx(&ctx, g_certificate[issuerCertificateIndex], NULL, NULL, g_crl, 0); // 第一个参数传NULL,无需传入未初始化的配置表 extension = X509V3_EXT_conf_nid(NULL, &ctx, extensionNid, (char*)extensionData); if (extension == NULL) { return 0; } result &= X509_CRL_add_ext(g_crl, extension, -1); // 手动释放扩展对象,X509_CRL_add_ext会内部复制扩展内容 X509_EXTENSION_free(extension); return result; }
方案2:CRL Number专属构造(兼容性更好)
如果修改通用函数后仍有问题,直接用ASN.1对象构造CRL Number扩展,跳过字符串解析步骤,兼容性更强。把GenerateCrl中添加CRL Number的代码替换为以下内容:
// 替换原来的 result &= SetCrlExtension(issuerCertificateIndex, NID_crl_number, crlNumberString); 行 ASN1_INTEGER* crlNumAsn1 = ASN1_INTEGER_new(); ASN1_INTEGER_set(crlNumAsn1, crlNumber); X509_EXTENSION* crlNumExt = X509V3_EXT_i2d(NID_crl_number, 0, crlNumAsn1); ASN1_INTEGER_free(crlNumAsn1); if (crlNumExt != NULL) { result &= X509_CRL_add_ext(g_crl, crlNumExt, -1); X509_EXTENSION_free(crlNumExt); } else { result = 0; }
验证方法
生成CRL后执行以下OpenSSL命令查看扩展:openssl crl -in crl.pem -text -noout
输出内容中会明确显示CRL Number字段。
内容的提问来源于stack exchange,提问作者seesharp
相关产品推荐
相关产品推荐

