将STACK_OF(X509)转换为ASN1流

时间:2016-03-14 18:57:30

标签: c++ c openssl asn.1

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

我使用的是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
}

我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

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

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

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

并且应用程序代码的流程类似于

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
}

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

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)

并且应用程序代码中的序列如下所示:

ListT

这种方式更好,因为它完全定义了'cert'字段实际上是什么。如果您与其他人交换数据,第一种方式并不是那么好,因为他们需要被告知证书字段实际上是什么。