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

问题描述 投票:0回答:1

我有一个存储在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---------------。

在命令行中,可以通过命令.NET来实现。

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?

openssl ssl-certificate x509
1个回答
1
投票

使用方法2:-)

虽然没有记录,大概是因为没有人自愿或捐赠,但从2009年的0.9.8j开始(2010年的1.0.0),它就在官方导出的声明中了。

X509扩展中的数据绝不是一个字符串那么简单,它必须是一个依赖于OID的ASN.1类型的DER编码,见 ExtensionRFC5280 Sec 4. 对于AIA来说,它是下列类型的DER编码:1. 4.2.2.1. 要像方法1那样自己做,你需要用以下方法来解析 d2i_AUTHORITY_INFO_ACCESS 然后通过元素寻找那些是OCSP的元素(不是所有的元素都需要,也可能没有),并包含一个URI(OCSP应该,根据rfc2560),然后清理,就像代码一样。在 cryptox509v3v3_utl.c 中。 除了你不必使用 STACK_OF(OPENSSL_STRING) 来计算结果,如果你喜欢其他的东西。

© www.soinside.com 2019 - 2024. All rights reserved.