将 STACK_OF(X509) 转换为 ASN1 流

convert STACK_OF(X509) to ASN1 stream

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

我使用的是 OpenSSL 1.0.2,但遇到了一些问题。我有一个带有三个证书的 STACK_OF(X509) 对象,我想将此堆栈转换为 ASN1 对象(如 OCTET STRING 或 ANY)。这可能吗?我使用外部 asn.1 库而不是 OpenSSL-ASN1。所以我需要数据作为无符号字符(原始二进制或 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) "Cheat"!如果证书的 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' 字段的实际内容。如果您要与其他人交换数据,第一种方法就不太好,因为他们需要被告知证书字段的实际内容。