如何使用OpenSSL解析SubjectDirectoryAttributes扩展? 我如何用C++中的OpenSSL读取X509证书扩展名:主题目录属性?p>
我的证书包含具有以下属性的SubjectDirectoryAttributes扩展:如何使用OpenSSL解析SubjectDirectoryAttributes扩展? 我如何用C++中的OpenSSL读取X509证书扩展名:主题目录属性?p>,c++,openssl,certificate,x509,C++,Openssl,Certificate,X509,我的证书包含具有以下属性的SubjectDirectoryAttributes扩展: OID : Value ------------------------------------------------------------------- (1.3.6.1.5.5.7.9.4) countryOfCitizenship : DE (1.3.6.1.5.5.7.9.3) gender
OID : Value
-------------------------------------------------------------------
(1.3.6.1.5.5.7.9.4) countryOfCitizenship : DE
(1.3.6.1.5.5.7.9.3) gender : F
(1.3.6.1.5.5.7.9.1) dateOfBirth : 1971-10-14 12:00:00 UTC
(1.3.6.1.5.5.7.9.2) placeOfBirth : Darmstadt
所以我想得到这对OID和值
在我可以使用的源代码中,我没有发现类似结构的SUBJECT\u DIRECTORY\u属性。我是这样得到分机的:
int loc = X509_get_ext_by_NID(certificate, NID_subject_directory_attributes, -1);
X509_EXTENSION *ex = X509_get_ext(certificate, loc);
但是我怎么才能得到所有的数据,也就是所有的OID和OID的值呢?ASN.1结构为:
SubjectDirectoryAttributes ::= Attributes
Attributes ::= SEQUENCE SIZE (1..MAX) OF Attribute
Attribute ::= SEQUENCE
{
type AttributeType
values SET OF AttributeValue
}
AttributeType ::= OBJECT IDENTIFIER
AttributeValue ::= ANY DEFINED BY AttributeType
我发现我得到了一个自定义扩展名:X509\u extension\u get\u object(ex)
,并且OpenSSL类型X509\u NAME\u条目
与ASN.1-Structure属性
对应AttributeTypeAndValue
。
因此,我尝试将X509\u EXTENSION\u get\u data(ex)
的结果强制转换为(X509\u NAME\u ENTRY)的堆栈和X509\u NAME
。但是X509\u NAME
与(X509\u NAME\u条目)
的STACK\u相同
然后,我试图通过调用(X509\u NAME\u ENTRY)的堆栈上的sk\u NAME\u ENTRY\u num()
函数来获取属性数X509\u NAME.entries
,但我没有找到正确的号码。
我希望得到数字3或4(不知道确切的内部计数-但是示例cert包含4个属性,因此输出应该是3或4,这取决于计数是从0还是1开始)。
但是我得到的不是3或4,而是一个更大的数字,比如34335029,每次运行代码时,这个数字都是不同的。因此,我认为铸造存在问题,或者我没有选择正确的数据类型
我正在使用OpenSSL 1.0.2j
那么,出了什么问题,我该如何解决
下面是我的代码的简短摘录:
X509_EXTENSION *ex = ....
STACK_OF(X509_NAME_ENTRY) *st = (STACK_OF(X509_NAME_ENTRY)*) X509_EXTENSION_get_data(ex);
printf(sk_X509_NAME_ENTRY_num(st));
// or alternative
X509_Name *name = (X509_Name*) X509_EXTENSION_get_data(ex);
printf(sk_X509_NAME_ENTRY_num(name.entries));
如果你需要的话,我在这里附上证书。它来自RFC规范:
----开始证书-----
MIIDEDCCANMGAWIBAGISAZYC0JANBKQHKIG9W0BAQUFADBIMQSWCQYDVQGEWJE
RTE5MDCGA1ECGWWR01EIC0GRM9YC2NODW5NC3PBNRYDW0GSW5MB3JTYXRPB25Z
DGVJAG5PAYBHBWJIMB4XDTA0MDIWMTEWMDAWMFOXDTA4MDIDWMTEWMDAWMFOWZTEL
Makga1EBHMCREUXNZA1BGNVBAOMLKDNRCBGB3JZY2H1BMDZEMVUDHJ1BSBJBMZV
CM1HDGLVBNN0ZWNOBMLREDYKGXHTAMBGNVBCOMBVBLDHJHMA0GA1UEBAWGQMFY
EMLUMIGFMA0GCSQGSIB3DQEBAQUA4GNADCBIQBGQDC50ZVODVA6WHPXSWG88P8
p4fPy1caIaqKIK1d/wFRMN5yTl7T+VOS57SWXKCDDZGZQZJQJJWJQAP3DQPK7AW3S
o7lBG6JZmiqMtlXG3+olv+3cc7WU+qDv5ZXGEqauW4x/DKGc7E/nq2BUZ2hLsjh9
Xy9+vbw+8KYE9RQEARDPJQIDAQABO4HPMIHMGQGA1DCQRDMFSWEAYKWYBBUH
CQXBBMCCREUWDWYIKWYBBUHCQMXAXMBRJADBGGRBGEFBQCJATERGA8xOTCxMTAX
NdeymdawmfowFWYIKWYBBUHCQIXCWWJRGFYBXN0YWR0MA4GA1UDDWEB/wQEAwIG
QDASBGNVhsaeczajmacgbsskcaebmbb8ga1diwqymbaafaabagmebqyhcakwwn
Dg/+3LqYMDkGCCsGAQUFBwEDBC0wKzApBggrBgEFBQcLAjAdMBuBGW11bmljaXBh
bgl0eubkyxjtc3rhzhquzguwdqyjkozihvcnaqefbqadgyayaj4yau7lya3x04h+C
7+DyD2xViJCm5zEYg1m5x4znHJIMZsYAU/vJJIJQkPKVsIgm6vP/H1kXyAu0g2Ep
z+VWPnhZK1uw+ay1KRXw8rw2mR8hQ2Ug6QZHYdky2HH3H/69rWSPp888G8CW8RLU
uIKzn+GhapCuGoC4qWdlGLWqfpc=
-----结束证书-----
由于OpenSSL在加密库中没有直接支持,因此没有用于解析此扩展的内置代码。我要么等待官方支持,要么自己实现整个过程。另请参见OpenSSL用户邮件列表。邮件列表中的这篇文章由我完成。但我不知道如何像OpenSSL团队使用GENERAL_名称那样进行操作。有人能帮忙吗?