конвертировать STACK_OF (X509) в поток ASN1

Прежде всего: извините за мой плохой английский. Я надеюсь, что вы меня понимаете.

Я использовал 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

Решение

Люди обычно делают одну из двух вещей для этого.

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’. Первый способ не очень хорош, если вы обмениваетесь данными с кем-то еще, потому что им нужно сказать, что такое поле сертификата.

0

Другие решения

Других решений пока нет …