Вл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