Прежде всего: извините за мой плохой английский. Я надеюсь, что вы меня понимаете.
Я использовал 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) «Чит»! Если 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’. Первый способ не очень хорош, если вы обмениваетесь данными с кем-то еще, потому что им нужно сказать, что такое поле сертификата.
Других решений пока нет …