首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OpenSSL将CRL号码分机添加到CRL

使用OpenSSL将CRL号码分机添加到CRL
EN

Stack Overflow用户
提问于 2021-09-22 13:41:02
回答 1查看 152关注 0票数 1

对于一些客户端测试,我需要“动态”生成证书和撤销列表。我能够使用OpenSSL控制台命令和配置文件设置带有CRL号扩展名的吊销列表。然而,我不能让它在代码中工作。

下面是我的相关函数:

代码语言:javascript
复制
X509* g_certificate[MAX_CERTIFICATE_COUNT];
EVP_PKEY* g_certificateKeyPair[MAX_CERTIFICATE_COUNT];
X509_CRL* g_crl;

UINT16 GenerateCrl(UINT16 issuerCertificateIndex, UINT16 crlNumber, INT32 lastUpdate, INT32 nextUpdate)
{
    ASN1_TIME* lastUpdateTime = ASN1_TIME_new();
    ASN1_TIME* nextUpdateTime = ASN1_TIME_new();
    char crlNumberString[32];
    int result = 1;

    if (g_crl != NULL) X509_CRL_free(g_crl);
    g_crl = X509_CRL_new();

    result &= X509_CRL_set_version(g_crl, 1);
    result &= X509_CRL_set_issuer_name(g_crl, X509_get_subject_name(g_certificate[issuerCertificateIndex]));
    // there are multiple X509 certificate objects stored in memory, which I use to setup certificate chains

    ASN1_TIME_set(lastUpdateTime, time(NULL) + lastUpdate);
    ASN1_TIME_set(nextUpdateTime, time(NULL) + nextUpdate);
    result &= X509_CRL_set1_lastUpdate(g_crl, lastUpdateTime);
    result &= X509_CRL_set1_nextUpdate(g_crl, nextUpdateTime);
    ASN1_TIME_free(lastUpdateTime);
    ASN1_TIME_free(nextUpdateTime);

    _itoa_s((int)crlNumber, crlNumberString, 10);
    // my CRLs need to have the authority key identifier and CRL number extensions
    result &= SetCrlExtension(issuerCertificateIndex, NID_authority_key_identifier, "keyid:always");  // this does add the auth key id extension
    result &= SetCrlExtension(issuerCertificateIndex, NID_crl_number, crlNumberString);  // this does not add CRL number the extension

    result &= X509_CRL_sign(g_crl, g_certificateKeyPair[issuerCertificateIndex], EVP_sha256());

    return result;
}

INT16 SetCrlExtension(UINT16 issuerCertificateIndex, INT16 extensionNid, const char* extensionData)
{
    X509V3_CTX ctx;
    X509_EXTENSION* extension;
    lhash_st_CONF_VALUE conf;  // actually I have no idea what this is for, probably it is not required here
    int result = 1;

    X509V3_set_ctx(&ctx, g_certificate[issuerCertificateIndex], NULL, NULL, g_crl, 0);
    extension = X509V3_EXT_conf_nid(&conf, &ctx, extensionNid, (char*)extensionData);
    result &= X509_CRL_add_ext(g_crl, extension, -1);

    return result;
}

void SaveCrlAsPem(const char* fileName)
{
    FILE* f;

    fopen_s(&f, fileName, "wb");
    PEM_write_X509_CRL(f, g_crl);
    if (f != NULL) fclose(f);
}

因此,例如

代码语言:javascript
复制
GenerateCrl(1, 1234, -3600, 36000);
SaveCrlAsPem("crl.pem"); 

应该导致具有所述扩展的CRL。但是它确实只包含授权密钥标识符扩展。其他的都很好。我也在以基本相同的方式添加证书扩展,没有任何问题。

那么,如何才能将CRL编号附加到我的CRL上呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-07 02:22:14

您提到可以从OpenSSL命令行设置CRL number扩展。然后,您可能应该看看特定命令的源代码。

我没有使用过CRL,但我相信您使用的是ca命令。在apps/ca.c的源代码中查找NID_crl_number (来自OpenSSL 1.1.1g)显示了以下代码:

代码语言:javascript
复制
/* Add any extensions asked for */

if (crl_ext != NULL || crlnumberfile != NULL) {
    X509V3_CTX crlctx;
    X509V3_set_ctx(&crlctx, x509, NULL, NULL, crl, 0);
    X509V3_set_nconf(&crlctx, conf);

    if (crl_ext != NULL)
        if (!X509V3_EXT_CRL_add_nconf(conf, &crlctx, crl_ext, crl))
            goto end;
    if (crlnumberfile != NULL) {
        tmpser = BN_to_ASN1_INTEGER(crlnumber, NULL);
        if (!tmpser)
            goto end;
        X509_CRL_add1_ext_i2d(crl, NID_crl_number, tmpser, 0, 0);
        ASN1_INTEGER_free(tmpser);
        crl_v2 = 1;
        if (!BN_add_word(crlnumber, 1))
            goto end;
    }
}

因此,您似乎可以使用X509V3_EXT_CRL_add_nconfX509_CRL_add1_ext_i2d来实现此目的。请参考您正在使用的OpenSSL版本的apps/ca.c

另一种解决方案:也许不是最好的方法,但您可以从代码中启动与进程相同的OpenSSL命令,并处理它们的输出(如果可以接受)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69285443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档