首先:抱歉我的英语不好。我希望你能理解我。
我使用的是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
}
我希望有人可以帮助我。
答案 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'字段实际上是什么。如果您与其他人交换数据,第一种方式并不是那么好,因为他们需要被告知证书字段实际上是什么。