如何使用OpenSSL解析SubjectDirectoryAttributes扩展? 我如何用C++中的OpenSSL读取X509证书扩展名:主题目录属性?p>

如何使用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

我的证书包含具有以下属性的SubjectDirectoryAttributes扩展:

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_名称那样进行操作。有人能帮忙吗?