【问题标题】:obtaining the OCSP URL from certificate using openSSL API使用 openSSL API 从证书中获取 OCSP URL
【发布时间】:2020-06-08 18:33:46
【问题描述】:

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

方法一——

首先,我通过以下方式获得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(),它返回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】:

    使用方法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(OCSP 应该,根据 rfc2560 ),然后进行清理,就像代码 in crypto/x509v3/v3_utl.c 一样,但如果您喜欢其他内容,则不必使用 STACK_OF(OPENSSL_STRING) 来获取结果。

    【讨论】:

    • 非常感谢
    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 2012-11-22
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多