将 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' 字段的实际内容。如果您要与其他人交换数据,第一种方法就不太好,因为他们需要被告知证书字段的实际内容。
首先:抱歉我的英语不好。我希望你能理解我。
我使用的是 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' 字段的实际内容。如果您要与其他人交换数据,第一种方法就不太好,因为他们需要被告知证书字段的实际内容。