如何使用 OpenSSL 解析 SubjectDirectoryAttributes 扩展?
How to parse SubjectDirectoryAttributes Extension with OpenSSL?
如何在 C++ 中阅读 X509 证书扩展:使用 OpenSSL 的主题目录属性?
我的证书包含具有以下属性的 SubjectDirectoryAttributes-Extension:
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_DIRECTORY_ATTRIBUTES 这样的结构。我是这样得到扩展的:
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_EXTENSION_get_object(ex)
并且 OpenSSL-Type X509_NAME_ENTRY
等同于 ASN.1-Structure Attribute
resp。 AttributeTypeAndValue
。
所以我尝试将 X509_EXTENSION_get_data(ex)
的结果转换为 STACK_OF(X509_NAME_ENTRY)
和 X509_NAME
。但是 X509_NAME
与 STACK_OF(X509_NAME_ENTRY)
相同。
然后我尝试通过调用 STACK_OF(X509_NAME_ENTRY)
上的 sk_X509_NAME_ENTRY_num()
函数来获取属性的数量。 X509_NAME.entries
,但我没有得到正确的数字。
我希望得到数字 3 或 4(不知道确切的内部计数 - 但示例证书包含 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 规范:
-----BEGIN CERTIFICATE-----
MIIDEDCCAnmgAwIBAgIESZYC0jANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQGEwJE
RTE5MDcGA1UECgwwR01EIC0gRm9yc2NodW5nc3plbnRydW0gSW5mb3JtYXRpb25z
dGVjaG5payBHbWJIMB4XDTA0MDIwMTEwMDAwMFoXDTA4MDIwMTEwMDAwMFowZTEL
MAkGA1UEBhMCREUxNzA1BgNVBAoMLkdNRCBGb3JzY2h1bmdzemVudHJ1bSBJbmZv
cm1hdGlvbnN0ZWNobmlrIEdtYkgxHTAMBgNVBCoMBVBldHJhMA0GA1UEBAwGQmFy
emluMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDc50zVodVa6wHPXswg88P8
p4fPy1caIaqKIK1d/wFRMN5yTl7T+VOS57sWxKcdDzGzqZJqjwjqAP3DqPK7AW3s
o7lBG6JZmiqMtlXG3+olv+3cc7WU+qDv5ZXGEqauW4x/DKGc7E/nq2BUZ2hLsjh9
Xy9+vbw+8KYE9rQEARdpJQIDAQABo4HpMIHmMGQGA1UdCQRdMFswEAYIKwYBBQUH
CQQxBBMCREUwDwYIKwYBBQUHCQMxAxMBRjAdBggrBgEFBQcJATERGA8xOTcxMTAx
NDEyMDAwMFowFwYIKwYBBQUHCQIxCwwJRGFybXN0YWR0MA4GA1UdDwEB/wQEAwIG
QDASBgNVHSAECzAJMAcGBSskCAEBMB8GA1UdIwQYMBaAFAABAgMEBQYHCAkKCwwN
Dg/+3LqYMDkGCCsGAQUFBwEDBC0wKzApBggrBgEFBQcLAjAdMBuBGW11bmljaXBh
bGl0eUBkYXJtc3RhZHQuZGUwDQYJKoZIhvcNAQEFBQADgYEAj4yAu7LYa3X04h+C
7+DyD2xViJCm5zEYg1m5x4znHJIMZsYAU/vJJIJQkPKVsIgm6vP/H1kXyAu0g2Ep
z+VWPnhZK1uw+ay1KRXw8rw2mR8hQ2Ug6QZHYdky2HH3H/69rWSPp888G8CW8RLU
uIKzn+GhapCuGoC4qWdlGLWqfpc=
-----END CERTIFICATE-----
由于 OpenSSL 在加密库中没有直接支持,因此没有用于解析此扩展的内置代码。要么等官方支持,要么自己实现。
如何在 C++ 中阅读 X509 证书扩展:使用 OpenSSL 的主题目录属性?
我的证书包含具有以下属性的 SubjectDirectoryAttributes-Extension:
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_DIRECTORY_ATTRIBUTES 这样的结构。我是这样得到扩展的:
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_EXTENSION_get_object(ex)
并且 OpenSSL-Type X509_NAME_ENTRY
等同于 ASN.1-Structure Attribute
resp。 AttributeTypeAndValue
。
所以我尝试将 X509_EXTENSION_get_data(ex)
的结果转换为 STACK_OF(X509_NAME_ENTRY)
和 X509_NAME
。但是 X509_NAME
与 STACK_OF(X509_NAME_ENTRY)
相同。
然后我尝试通过调用 STACK_OF(X509_NAME_ENTRY)
上的 sk_X509_NAME_ENTRY_num()
函数来获取属性的数量。 X509_NAME.entries
,但我没有得到正确的数字。
我希望得到数字 3 或 4(不知道确切的内部计数 - 但示例证书包含 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 规范:
-----BEGIN CERTIFICATE-----
MIIDEDCCAnmgAwIBAgIESZYC0jANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQGEwJE
RTE5MDcGA1UECgwwR01EIC0gRm9yc2NodW5nc3plbnRydW0gSW5mb3JtYXRpb25z
dGVjaG5payBHbWJIMB4XDTA0MDIwMTEwMDAwMFoXDTA4MDIwMTEwMDAwMFowZTEL
MAkGA1UEBhMCREUxNzA1BgNVBAoMLkdNRCBGb3JzY2h1bmdzemVudHJ1bSBJbmZv
cm1hdGlvbnN0ZWNobmlrIEdtYkgxHTAMBgNVBCoMBVBldHJhMA0GA1UEBAwGQmFy
emluMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDc50zVodVa6wHPXswg88P8
p4fPy1caIaqKIK1d/wFRMN5yTl7T+VOS57sWxKcdDzGzqZJqjwjqAP3DqPK7AW3s
o7lBG6JZmiqMtlXG3+olv+3cc7WU+qDv5ZXGEqauW4x/DKGc7E/nq2BUZ2hLsjh9
Xy9+vbw+8KYE9rQEARdpJQIDAQABo4HpMIHmMGQGA1UdCQRdMFswEAYIKwYBBQUH
CQQxBBMCREUwDwYIKwYBBQUHCQMxAxMBRjAdBggrBgEFBQcJATERGA8xOTcxMTAx
NDEyMDAwMFowFwYIKwYBBQUHCQIxCwwJRGFybXN0YWR0MA4GA1UdDwEB/wQEAwIG
QDASBgNVHSAECzAJMAcGBSskCAEBMB8GA1UdIwQYMBaAFAABAgMEBQYHCAkKCwwN
Dg/+3LqYMDkGCCsGAQUFBwEDBC0wKzApBggrBgEFBQcLAjAdMBuBGW11bmljaXBh
bGl0eUBkYXJtc3RhZHQuZGUwDQYJKoZIhvcNAQEFBQADgYEAj4yAu7LYa3X04h+C
7+DyD2xViJCm5zEYg1m5x4znHJIMZsYAU/vJJIJQkPKVsIgm6vP/H1kXyAu0g2Ep
z+VWPnhZK1uw+ay1KRXw8rw2mR8hQ2Ug6QZHYdky2HH3H/69rWSPp888G8CW8RLU
uIKzn+GhapCuGoC4qWdlGLWqfpc=
-----END CERTIFICATE-----
由于 OpenSSL 在加密库中没有直接支持,因此没有用于解析此扩展的内置代码。要么等官方支持,要么自己实现。