Запрос на сертификат

Добрый день. Пытаюсь освоиться с C_EX_CreateCSR. Среди всего прочего ее аргументом является список расширений. В примере из SDK указаны строки вида
"ASN1:FORMAT:HEX,OCTETSTRING:FE117B93CEC6B5065E1613E155D3A9CA597C0F81"
"DER:30:0F:81:0D:65:78:61:6d:70:6c:65:40:79:61:2E:72:75"
"critical,DER:30:0A:30:08:06:06:2A:85:03:64:71:01"
"ASN1:UTF8String:СКЗИ \\\"Рутокен ЭЦП 2.0\\\""

Подскажите, пожалуйста, где найти общие правила конструирования таких строк? Может ли быть, напимер, critical,ASN1..., DER:ASN1... или еще что? Как какую либо описанную в ASN1 структуру транслировать в такую строку?

Спасибо

Re: Запрос на сертификат

Влaдимиp, добрый день!

О формате полей сертификата лучше всего расскажут Требования к форме квалифицированного сертификата ключа проверки электронной подписи

Re: Запрос на сертификат

Спасибо, ни разу не то. В требованиях лишь описаны структуры типа
IssuerSignTool ::= SEQUENCE {

    signTool            UTF8String SIZE(1.200),

    cATool              UTF8String SIZE(1..200),

    signToolCert        UTF8String SIZE(1.. 100),

    cAToolCert          UTF8String SIZE(1.100) }.

Вопрос в том, как из нее получить строку, которую примет C_EX_CreateCSR. В Данном случае должно быть что-то вроде ASN1:SEQUENCE:<Что-то еще>. Вопрос в том, как по имеющимся ASN- структурам строить такие строки, а еще лучше - общие правила построения таких строк, включая явно не относящийся к ASN модификатор critical и возможные иные модификаторы

Re: Запрос на сертификат

Влaдимиp, добрый день!

Функция C_EX_CreateCSR библиотеки pkcs11ecp использует синтаксис, применяемый для описания расширений в OpenSSL x509v3_config. С синтаксисом можно ознакомиться по ссылке: https://www.openssl.org/docs/manmaster/ … onfig.html . В том числе поддерживаются задаваемые пользователем структуры расширений специального вида (см. ARBITRARY EXTENSIONS).
К сожалению, построение расширений специального вида -- не самая приятная задача (особенно отладка при помощи самой функции C_EX_CreateCSR). Надеюсь, описание ниже позволит немного упростить вам использование.

C_EX_CreateCSR принимает расширения в виде последовательно перечисленных пар IDENTIFIER, VALUE. Можно считать, что для каждой пары строится следующее описание в синтаксисе OpenSSL x509v3_config:

[extension]
IDENTIFIER = VALUE

Если необходимо задать ARBITRARY EXTENSION, включающее в себя CONSTRUCTED тип, VALUE будет многострочным, например:

const char* VALUE = "critical,ASN1:SEQUENCE:IssuerSignTool\n[IssuerSignTool]\nsignTool = UTF8String:\"SignTool\"\ncATool = UTF8String:\"cATool\"\nsignToolCert = UTF8String:\"signToolCert\"\ncAToolCert = UTF8String:\"cAToolCert\"";

Немного понятнее будет с современным C++:

const char* VALUE = R"(critical,ASN1:SEQUENCE:IssuerSignTool
[IssuerSignTool]
signTool = UTF8String:"SignTool"
cATool = UTF8String:"cATool"
signToolCert = UTF8String:"signToolCert"
cAToolCert = UTF8String:"cAToolCert")";

Для отладки описания расширения специального вида можно воспользоваться утилитами в openssl: asn1parse или req.

Использование asn1parse. Задать описание ASN1-структуры в файле (asn1.nconf), например:

asn1 = SEQUENCE:IssuerSignTool

[IssuerSignTool]
signTool = UTF8String:"SignTool"
cATool = UTF8String:"SignTool"
signToolCert = UTF8String:"signToolCert"
cAToolCert = SEQUENCE:ololo


[ololo]
a=INTEGER:01

и далее попробовать это конвертировать в бинарное представление:

openssl asn1parse -genconf ./asn1.conf -out 1.der
    0:d=0  hl=2 l=  39 cons: SEQUENCE
    2:d=1  hl=2 l=   8 prim: UTF8STRING        :SignTool
   12:d=1  hl=2 l=   8 prim: UTF8STRING        :SignTool
   22:d=1  hl=2 l=  12 prim: UTF8STRING        :signToolCert
   36:d=1  hl=2 l=   3 cons: SEQUENCE
   38:d=2  hl=2 l=   1 prim: INTEGER           :01

Для отладки при помощи утилиты req в используемом файле openssl.cnf необходимо заполнить секцию, задающую описание расширений запроса, после чего попробовать сгенерировать такой запрос на сертификат. Если удалось, все, что слева от равно в значении секции можно использовать как IDENTIFIER, а все, что справа, до конца секции, -- как VALUE в вызове C_EX_CreateCSR.
Например, в openssl.cnf расширение для запроса может быть настроено таким образом:

# Настройки создания запросов на сертификат
[ req ]
prompt = no
distinguished_name = req_distinguished_name
req_extensions = ext1

[ ext1 ]
1.2.2.2.3.1 = critical,ASN1:SEQUENCE:IssuerSignTool

[IssuerSignTool]
signTool = UTF8String:"SignTool"
cATool = UTF8String:"SignTool"
signToolCert = UTF8String:"signToolCert"
cAToolCert = SEQUENCE:ololo

[ololo]
a=INTEGER:01

Чтобы убедиться, что описание правильное, нужно попробовать создать запрос:

OPENSSL_CONF=openssl.cnf openssl req -new

Re: Запрос на сертификат

Огромное спасибо, это похоже на то, что нужно