【问题标题】:convert STACK_OF(X509) to ASN1 stream将 STACK_OF(X509) 转换为 ASN1 流
【发布时间】:2016-06-29 23:31:09
【问题描述】:

首先:对不起我的英语不好。我希望你能理解我。

我使用的是 OpenSSL 1.0.2,但遇到了一些问题。我有一个带有三个证书的 STACK_OF(X509) 对象,我想将此堆栈转换为 ASN1 对象(如 OCTET STRING 或 ANY)。这可能吗?我使用外部 asn.1 库而不是 OpenSSL-ASN1。所以我需要数据为 unsigned char(原始二进制或 DER 编码)。

我可以通过 i2d_X509() 将单个证书转换为 DER 格式。这很好,但我想要完整的堆栈。这是我的目标:

myAsn1Data ::= sequence {
    ...  -- (some ASN.1 data)
    ...  -- (some ASN.1 data)
    ANY  -- contain the DER encoded STACK_OF(X509)....somehow
}

但这可能是正确的方式(ASN.1 语法):

stackOfX509 ::= SEQUENCE_Of {
    TBSCertificate  
}

或者像这样:

stackOfX509 ::= SET_OF {
    ANY  -- contain a DER encoded X509 certificate
}

我希望有人可以帮助我。

【问题讨论】:

    标签: c++ c openssl asn.1


    【解决方案1】:

    人们通常会为此做两件事之一。

    1) “作弊”!如果证书的 DER 编码表示可用但它的原始模式不可用,则只需使用 OCTET STRING 来存储字节。

    myAsn1Data ::= SEQUENCE {
        ..., -- (some ASN.1 Data)
        ..., -- (some ASN.1 Data)
        cert [2] OCTET STRING -- (the DER bytes would go in this field)
    }
    

    您的应用程序代码流程类似于

    myAsn1Data data = new(myAsn1Data);
    data.cert = readbytesfromfile(certificatefile);
    data.something = 10;
    data.else = 20;
    asn1encode(data, outputfile)
    

    2) 获取 X509 证书的原始架构。它应该在 here 某处,看起来像第 7.2 节。有了这个,您的 ASN.1 编译器将为您创建的源应该能够解码证书,允许您将其放置在 myAsn1Data 的实例中。

    IMPORTS Certificate FROM <ITU's X509 Schema file>
    
    CertificateStack ::= SEQUENCE of Certificate
    
    myAsn1Data ::= SEQUENCE {
        ..., -- (some ASN.1 Data)
        ..., -- (some ASN.1 Data)
        cert [2] CertificateStack
    }
    

    您的应用程序代码中的序列将如下所示:

    Certificate cert1 = asn1decode(certificatefile);
    Certificate cert2 = asn1decode(anothercertificatefile);
    Certificate cert3 = asn1decode(yetanothercertificatefile);
    CertificateStack stack;
    stack.push_back(cert1);
    stack.push_back(cert2);
    stack.push_back(cert3);
    myAsn1Data data = new(myAsn1Data);
    data.cert = stack;
    data.something = 10;
    data.else = 20;
    asn1encode(data, outputfile)
    

    这种方式更好,因为它完全定义了“cert”字段的实际含义。如果您要与其他人交换数据,第一种方法就不太好,因为他们需要被告知 cert 字段实际上是什么。

    【讨论】:

    • @SBond,别担心,希望一切顺利。
    猜你喜欢
    • 2020-02-25
    • 2016-11-03
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多