繁体   English   中英

将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。 所以我需要数据作为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)“作弊”! 如果证书的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证书的原始模式。 它应该在这里的某个地方,看起来像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”字段的实际含义。 如果您与其他人交换数据,第一种方式并不是那么好,因为他们需要被告知证书字段实际上是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM