我正在使用OpenSSL库的X509证书类,我需要查询“密钥用法”扩展。
放弃OpenSSL的vapourware“文档”后,一些黑暗的网络搜索最终显示我需要调用
X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx)
并搜索objects.h标头显示正确的NID。
问题是,这个调用返回一个指向void的指针,这显然可以指向各种结构,具体取决于所要求的扩展名。
由于这些似乎都没有记录,因此没有办法解决如何解析函数返回的问题。
有人能指出我实际谈到这个问题的文件,而不只是列出我自己能找到的东西(功能简介,它来自哪个文件等)?
答案 0 :(得分: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);
}
答案 1 :(得分:1)
第二个参数(nid)确定返回的类型。
查看此代码:
对于密钥用法NID,它似乎返回ASN1_BIT_STRING。 (第361行)。