Недавно на работе возникла необходимость настроить генерацию ключевой пары и запроса на сертификат x.509 с помощью OpenSSL и алогритмов ГОСТ. После изучения материала по данной теме было найдено определенное решение и построен соответсвующий алгоритм действий, который и хотелось бы описать.
Настройка OpenSSL
Итак для генерации ключей по ГОСТ у OpenSSL идет библиотека libgost.so, которая поставляется с OpenSSL, не не входит в конфигурацию по умолчанию. Подробнее можно прочитать здесь. В кратце порядок дествий следующий:
-
в глобальную секцию настроек добавить
openssl_conf = openssl_def
-
Затем добавить секцию с описание заданной конфигурации
[openssl_def] engines = engine_section
-
Теперь надо дабавить секцию с описание движка шифрования
[engine_section] gost = gost_section
-
И напоследок добавть секцию с описание параметров указанного выше движка
[gost_section] engine_id = gost dynamic_path = /usr/lib/ssl/engines/libgost.so default_algorithms = ALL CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
Расширение OpenSSL сертификата дополнительными полями:
В файле openssl.conf нужно:
-
Задать секцию расширений
req_extensions = v3_req # The extensions to add to a certificate request
-
Описать поля, которые будут входить в секцию расширений
[ v3_req ] certificatePolicies = 1.2.643.100.113.1, 1.2.643.100.113.2 1.2.643.100.111 = ASN1:UTF8String:ATLAS NCM keyUsage = critical, Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment subjectAltName = DER:3014A012060355042DA00B0309000400FFFFFFFFFFFF
-
Для добавления кастомных полей в поле subject сертификата, в секцию [ newoids ] вписать нужные поля, например:
[ v3_req ] inn = 1.2.643.3.131.1.1 ogrn = 1.2.643.100.1
Основные команды по работе с OpenSSL:
Сгенерировать закрытый ключ c помощью ГОСТ:
openssl genpkey -algorithm gost2001 -pkeyopt paramset:A -out file.key
Вытащить закрытый ключ из полученного файла (без первых 3-х байт):
openssl asn1parse -in file.key -offset 35 -out key
Генерируем запрос на сертификат:
openssl req -new -key file.key -subj "сабжект" -out file.req
Для самоподписанного сертификатв выполнить для запроса команду:
openssl x509 -req -days 365 -in file.req -signkey test.key -out cert.cer
Посмотреть сертификат можно:
openssl x509 -in cert.cer -noout -text
Выгрузить в контейнер PKCS#12:
openssl pkcs12 -export -out test.p12 -in cert.cer -inkey test.key
comments powered by Disqus