提问人:SBond 提问时间:3/15/2016 更新时间:3/19/2016 访问量:686
将 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
}
我希望有人能帮助我。
答:
0赞
bazza
3/19/2016
#1
人们通常会为此做两件事之一。
1)“作弊”!如果证书的 DER 编码表示形式可用,但证书的原始架构不可用,则只需使用八位字节字符串来存储字节即可。
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 证书的原始架构。它应该在这里的某个地方,看起来像第 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”字段的实际含义。如果您与其他人交换数据,第一种方法就不太好了,因为他们需要被告知证书字段的实际内容。
评论
0赞
bazza
3/22/2016
@SBond,不用担心,希望一切顺利。
评论