You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenSSL代码为CRL添加CRL number扩展失败如何解决

问题原因

你的代码有三处核心问题导致CRL Number扩展添加失败:

  1. 声明的lhash_st_CONF_VALUE conf未初始化就传入X509V3_EXT_conf_nid,干扰了扩展解析逻辑,该参数在无自定义配置的场景下直接传NULL即可。
  2. 未判断X509V3_EXT_conf_nid的返回值,扩展创建失败时没有感知路径。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:57:06