使用openSSL API从证书中获取OCSP URL

4

我有一个存储在X509结构中的证书,我想从中获取OCSP响应器的URL。我找到了两种方法来做到这一点 -

方法1 -

首先,我通过以下方式获取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);

这种方法基本可行,但由于存在大量不可打印字符,因此无法使用。

方法2 -

在命令行中,可以通过以下命令实现:

openssl x509 -noout -ocsp_uri -in extracted.crt.pem

我深入研究了openSSL的源代码,以查看它是如何打印这些信息的。我找到了函数X509_get1_ocsp(),该函数返回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?

1个回答

2
使用方法2 :-)
虽然没有文档说明,可能是因为没有志愿者或捐赠者,但自2009年0.9.8j(和2010年的1.0.0)以来,它已经在官方导出声明中了。
X509扩展中的数据从不像字符串那么简单;它必须是依赖于OID的ASN.1类型的DER编码,参见rfc5280 sec 4中的Extension。对于AIA,它是4.2.2.1中类型的DER编码。要使用方法1自己执行此操作,您需要使用d2i_AUTHORITY_INFO_ACCESS进行解析,然后浏览元素以查找那些用于OCSP(不一定全部都需要,可能没有)并包含URI的元素(根据rfc2560,OCSP应该包含URI),然后进行清理,类似于在crypto/x509v3/v3_utl.c中的代码,但如果您喜欢其他结果,就不必使用STACK_OF(OPENSSL_STRING)。

非常感谢。 - Teja Juluru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接