9

我正在使用 OpenSSL 库的 X509 证书类,我需要查询“密钥使用”扩展名。

在放弃 OpenSSL 的蒸汽软件“文档”后,一些暗中的网络搜索最终显示我需要调用

X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx) 

并通过 objects.h 标头搜索显示正确的 NID。

问题是,这个调用返回一个指向 void 的指针,它显然可以指向各种结构,具体取决于所要求的扩展。

由于这些似乎都没有记录,因此无法弄清楚如何解析函数返回的内容。

谁能给我指出一个真正讨论这个问题的文档,而不是仅仅列出我自己可以找到的东西(函数配置文件、它来自哪个文件等)?

4

2 回答 2

5

阅读密钥用法的最简单解决方案似乎是

X509* x509_cert = ...
// without X509_check_ca x509_cert->ex_kusage always returns 0 (no idea why)
int ca = X509_check_ca(x509_cert);
unsigned long usage = x509_cert->ex_kusage;

结果值在 opensc/pkcs15-init.h 中定义

SC_PKCS15INIT_X509_DIGITAL_SIGNATURE     0x0080UL
SC_PKCS15INIT_X509_NON_REPUDIATION       0x0040UL
SC_PKCS15INIT_X509_KEY_ENCIPHERMENT      0x0020UL
SC_PKCS15INIT_X509_DATA_ENCIPHERMENT     0x0010UL
SC_PKCS15INIT_X509_KEY_AGREEMENT         0x0008UL
SC_PKCS15INIT_X509_KEY_CERT_SIGN         0x0004UL
SC_PKCS15INIT_X509_CRL_SIGN              0x0002UL

我通过找到以下openssl源文件的代码来到了那个灵魂

/* Handle key usage */
if((usage=X509_get_ext_d2i(x, NID_key_usage, NULL, NULL))) {
    if(usage->length > 0) {
        x->ex_kusage = usage->data[0];
        if(usage->length > 1) 
        x->ex_kusage |= usage->data[1] << 8;
    } else x->ex_kusage = 0;
    x->ex_flags |= EXFLAG_KUSAGE;
    ASN1_BIT_STRING_free(usage);
}
于 2010-09-16T12:03:54.713 回答
1

第二个参数(nid)确定返回的类型。

看这段代码:

http://opengrok.creo.hu/dragonfly/xref/src/crypto/openssl-0.9/crypto/x509v3/v3_purp.c#X509_check_ purpose

看来,对于密钥使用 NID,它返回 ASN1_BIT_STRING。(第 361 行)。

于 2009-02-05T02:10:35.417 回答