使用 openSSL API 从证书中获取 OCSP URL
obtaining the OCSP URL from certificate using openSSL API
我有一个存储在 X509 结构中的证书,我想从中获取 URL 到 OCSP 响应程序。我找到了两种方法 -
方法一-
首先,我通过以下方式获得了一个X509_EXTENSION
结构:
const STACK_OF(X509_EXTENSION)* ext_stack = NULL;
ext_stack = X509_get0_extensions(cert);
int ext_loc = X509v3_get_ext_by_NID(ext_stack, NID_info_access, -1);
X509_EXTENSION *AIA = X509v3_get_ext(ext_stack, ext_loc);
但是后来我找不到任何关于如何在这个结构中打印数据的正确信息。我找到的最好方法是:
ASN1_OCTET_STRING *asn1_str = X509_EXTENSION_get_data(AIA);
const unsigned char* str = asn1_str->data;
long xlen;
int tag, xclass;
int ret = ASN1_get_object(&str, &xlen, &tag, &xclass, asn1_str->length);
printf("str = %s\n",str);
这种方法有点用,但由于中间散落着许多不可打印的字符而无法使用。
方法二-
在命令行中,可以通过以下命令实现:
openssl x509 -noout -ocsp_uri -in extracted.crt.pem
我仔细研究了 openSSL 的源代码,看看它是如何打印这些信息的。我找到了函数 X509_get1_ocsp()
其中 returns STACK_OF(OPENSSL_STRINGS)
.
这段代码毫不费力地打印出 URL :
STACK_OF(OPENSSL_STRING) *str_stack = X509_get1_ocsp(cert);
for(int i = 0;i < sk_OPENSSL_STRING_num(str_stack);i++)
BIO_printf(outbio, "%s\n", sk_OPENSSL_STRING_value(str_stack, i));
但是,我对使用这个函数犹豫不决,因为除了源代码之外,其他地方都没有提到它。其他问题的答案更喜欢使用方法 1。我该怎么做?是否有更好的方法使用方法 1 提取所需信息,还是我应该坚持使用方法 2?
使用方法二:-)
虽然没有记录,大概是因为没有人自愿或捐赠,但自 2009 年的 0.9.8j(和 2010 年的 1.0.0)以来,它一直在正式导出的声明中。
X509 扩展中的数据绝非字符串那么简单;它必须是依赖于 OID 的 ASN.1 类型的 DER 编码,请参阅 rfc5280 sec 4. For AIA, it is the DER encoding of the type in 4.2.2.1. To do this yourself a la method 1, you need to parse with d2i_AUTHORITY_INFO_ACCESS
and then go through the elements looking for those that are for OCSP (not all need be and possibly none are) and contain a URI (OCSP should, per rfc2560), and then clean up, much like the code in crypto/x509v3/v3_utl.c 中的 Extension
除非您不必使用 STACK_OF(OPENSSL_STRING)如果您更喜欢其他东西,请查看结果。
我有一个存储在 X509 结构中的证书,我想从中获取 URL 到 OCSP 响应程序。我找到了两种方法 -
方法一-
首先,我通过以下方式获得了一个X509_EXTENSION
结构:
const STACK_OF(X509_EXTENSION)* ext_stack = NULL;
ext_stack = X509_get0_extensions(cert);
int ext_loc = X509v3_get_ext_by_NID(ext_stack, NID_info_access, -1);
X509_EXTENSION *AIA = X509v3_get_ext(ext_stack, ext_loc);
但是后来我找不到任何关于如何在这个结构中打印数据的正确信息。我找到的最好方法是:
ASN1_OCTET_STRING *asn1_str = X509_EXTENSION_get_data(AIA);
const unsigned char* str = asn1_str->data;
long xlen;
int tag, xclass;
int ret = ASN1_get_object(&str, &xlen, &tag, &xclass, asn1_str->length);
printf("str = %s\n",str);
这种方法有点用,但由于中间散落着许多不可打印的字符而无法使用。
方法二-
在命令行中,可以通过以下命令实现:
openssl x509 -noout -ocsp_uri -in extracted.crt.pem
我仔细研究了 openSSL 的源代码,看看它是如何打印这些信息的。我找到了函数 X509_get1_ocsp()
其中 returns STACK_OF(OPENSSL_STRINGS)
.
这段代码毫不费力地打印出 URL :
STACK_OF(OPENSSL_STRING) *str_stack = X509_get1_ocsp(cert);
for(int i = 0;i < sk_OPENSSL_STRING_num(str_stack);i++)
BIO_printf(outbio, "%s\n", sk_OPENSSL_STRING_value(str_stack, i));
但是,我对使用这个函数犹豫不决,因为除了源代码之外,其他地方都没有提到它。其他问题的答案更喜欢使用方法 1。我该怎么做?是否有更好的方法使用方法 1 提取所需信息,还是我应该坚持使用方法 2?
使用方法二:-)
虽然没有记录,大概是因为没有人自愿或捐赠,但自 2009 年的 0.9.8j(和 2010 年的 1.0.0)以来,它一直在正式导出的声明中。
X509 扩展中的数据绝非字符串那么简单;它必须是依赖于 OID 的 ASN.1 类型的 DER 编码,请参阅 rfc5280 sec 4. For AIA, it is the DER encoding of the type in 4.2.2.1. To do this yourself a la method 1, you need to parse with d2i_AUTHORITY_INFO_ACCESS
and then go through the elements looking for those that are for OCSP (not all need be and possibly none are) and contain a URI (OCSP should, per rfc2560), and then clean up, much like the code in crypto/x509v3/v3_utl.c 中的 Extension
除非您不必使用 STACK_OF(OPENSSL_STRING)如果您更喜欢其他东西,请查看结果。