Добрый день!Извините меня за мое ламерство и руки из задницы. Уже не знаю,у кого и как спрашивать.Осталось спросить только у данного сообщества и именно в этой ветке,так моя тема вскользь касается данного раздела. Мне поставлена задача,имея на руках сертификат КриптоПРО (ГОСТ-2012): сформировать *.pem-файл.
Данные манипуляции я провожу на Windows 7 x64 SP1. Почитав,кучу форумов,в том числе и этот я работу по воплощении задачи:
1.скачал отсюда
https://www.cryptopro.ru...p/downloads#latest_csp50 и установил КриптоПРО 5.0 (так как читая разные форумы,я остановил выбор на данной версии КриптоПРО).
2.скачал отсюда
https://www.softpedia.co...-Libraries/OpenSSL.shtml и установил openSSL 1.1.1a (читая данный форум
https://www.cryptopro.ru....aspx?g=posts&t=8544 понял для того чтобы заработала библиотека ГОСТ-2012 необходимо именно версиюболше,чем 1.1.0,другие форумы советовали устанавливать именно 1.1.1);
3.скачал отсюда
https://update.cryptopro...x-gost/bin/185515/win64/ и положил в папку bin (C:\Program Files\OpenSSL\bin) с установленной программой openSSL библиотеку gostengy.dll для ГОСТ-2012.
4.Как описано на форуме
https://habr.com/post/187574/ открываю и дополняю два файла C:\Program Files\OpenSSL\bin\openssl.cfg и C:\Program Files\OpenSSL\bin\cnf\openssl.cnf следующими строками:
в начало добавляю
openssl_conf = openssl_def
в конец добавляю
# OpenSSL default section
[openssl_def]
engines=engine_section
# Engine scetion
[engine_section]
gost=gost_section
# Engine gost section
[gost_section]
engine_id=gost
dynami
c_path = C:\\Program Files\\OpenSSL\\bin\\gostengy.dll
default_algorithms=ALL
#CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
p.s.
путь к ГОСТовой библиотеки gostengy.dll c_path = C:\\Program Files\\OpenSSL\\bin\\gostengy.dll прописываю через двойные слэши, как написано в комментарии к статье
http://ali47802.blogspot...12/07/openssl-gost.html, правда где-то встречал и что можно написать с одинарным обратным слэшем,но не проверял,то есть в моем случае:
c_path = C:/Program Files/OpenSSL/bin/gostengy.dll
p.p.s
в параметре default_algorithms указывю
default_algorithms=ALL
,то есть использование движком всех алгоритмов, которые есть в движке,но совсем не ясно так это или не так,проверить не смог,так как нет нормальных знаний в данной области. Но здесь
https://www.cryptopro.ru...aspx?g=posts&m=93644 нашёл описание параметра немного по-другому (думаю,что это одно и то же написано только по-разному):
default_algorithms = CIPHERS, DIGESTS, PKEY, PKEY_CRYPTO, PKEY_ASN1
p.p.p.s
параметр CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet закомментировал,так как непонятно как его использовать в свете ГОСТ-2012,так как здесь
https://kirill-zak.ru/2015/08/13/298 написано, что параметр CRYPT_PARAMS нужен только для библиотеки gostengy.dll,которая позволяет пользователю выбирать наборы параметров симметричного алгоритма шифрования. Без этой опции не будет работать опция -gost89, что в свою очередь ведёт к тому, что при шифровании данных вместо GOST 28147-89 используется rc2-cbc.Так как мне ламеру не понятно,как это может мне помочь в моем случае,плюсом с данной настройкой ни чего не работает,то я её закоментил.
Хотя,здесь
https://www.cryptopro.ru...aspx?g=posts&t=12090 написано,какие настоящее время в КриптоПро CSP поддерживаются следующие параметры ключей ГОСТ Р 34.10-2012 (предложены варианты параметра CRYPT_PARAMS,но не один из этих параметров в моем случае правильно не работает,хотя подпись выпущена, как ГОСТ Р 34.11-2012/34.10-2012 256 бит):
Для 256-битной подписи:
id-GostR3410-2001-CryptoPro-A-ParamSet
id-GostR3410-2001-CryptoPro-XchA-ParamSet
id-GostR3410-2001-CryptoPro-B-ParamSet
id-GostR3410-2001-CryptoPro-XchB-ParamSet
id-GostR3410-2001-CryptoPro-C-ParamSet
id-tc26-gost-3410-2012-256-paramSetA
Для 512-битной подписи:
id-tc26-gost-3410-12-512-paramSetA
id-tc26-gost-3410-12-512-paramSetB
id-tc26-gost-3410-12-512-paramSetC
5.Как описано на форуме
https://habr.com/post/187574/ добавляю новый параметр OPENSSL_CONF в "Переменные среды" (Панель управления-Система-Дополнительные парамтеры системы-Дополнительно-Переменные среды) и подставляю значение перменной C:\Program Files\OpenSSL\bin\openssl.cfg, и в PATH через "точку с запятой" дописываю путь к каталогу C:\Program Files\OpenSSL\bin\
6.Импортирую с помощью КриптоПРО сертификат в формате *.pfx, следующим образом:
Панель управления-КриптоПРО CSP- Сервис-Просмотреть сертификаты в контейнере-Обзор-выбираю закрытый контейнер-Свойства-Состав-Копировать в файл-Далее-Да,экспортировать закрытый ключ-Далее-выбираю Файл обмена личной информацией -PKCS #12 (.PFX) и выбираю опцию "Включить по возможности все сертификаты в путь сертификакации"-Далее-ввожу пин-код от контейнера и выбираю куда выгружать файл (например,выгружаю в bin -C:\Program Files\OpenSSL\bin\) и получаю файл *.pfx
7.Далее прехожу к openSSL. Перехожу к папке с установленной программой:
C:\Users\User>cd C:\Program Files\OpenSSL\bin\
далее даю следующую команду (прочитал в коментарии здесь
https://toster.ru/q/221880)C:\Program Files\OpenSSL\bin> set OPENSSL_CONF=C:\Program Files\OpenSSL\bin\openssl.cfg
вывожу доступные алгоритмы для обеспечения уровня безопасности
C:\Program Files\OpenSSL\bin>openssl ciphers
но алгоритмы ГОСТ в списке отсутствуют:
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE
-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:E
CDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY13
05:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-
SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:E
CDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-ECD
SA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECD
HE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:RSA-PSK-AES256-GCM-SHA384:DHE-PSK-AES256-GC
M-SHA384:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-
POLY1305:AES256-GCM-SHA384:PSK-AES256-GCM-SHA384:PSK-CHACHA20-POLY1305:RSA-PSK-A
ES128-GCM-SHA256:DHE-PSK-AES128-GCM-SHA256:AES128-GCM-SHA256:PSK-AES128-GCM-SHA2
56:AES256-SHA256:AES128-SHA256:ECDHE-PSK-AES256-CBC-SHA384:ECDHE-PSK-AES256-CBC-
SHA:SRP-RSA-AES-256-CBC-SHA:SRP-AES-256-CBC-SHA:RSA-PSK-AES256-CBC-SHA384:DHE-PS
K-AES256-CBC-SHA384:RSA-PSK-AES256-CBC-SHA:DHE-PSK-AES256-CBC-SHA:AES256-SHA:PSK
-AES256-CBC-SHA384:PSK-AES256-CBC-SHA:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES1
28-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:SRP-AES-128-CBC-SHA:RSA-PSK-AES128-CBC-SHA256
:DHE-PSK-AES128-CBC-SHA256:RSA-PSK-AES128-CBC-SHA:DHE-PSK-AES128-CBC-SHA:AES128-
SHA:PSK-AES128-CBC-SHA256:PSK-AES128-CBC-SHA
где-то прочитал,что нужно немного модернизировать команду set и делаю её вот в этом ключе:
C:\Program Files\OpenSSL\bin>Set OPENSSL_CONF=C:\Program Files\OpenSSL\bin\cnf\openssl.cnf
проверяю алгоритмы ГОСТ (и о чудо они появились):
C:\Program Files\OpenSSL\bin>openssl ciphers
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE
-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:E
CDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY13
05:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-
SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:E
CDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-ECD
SA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECD
HE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:RSA-PSK-AES256-GCM-SHA384:DHE-PSK-AES256-GC
M-SHA384:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-
POLY1305:AES256-GCM-SHA384:PSK-AES256-GCM-SHA384:PSK-CHACHA20-POLY1305:RSA-PSK-A
ES128-GCM-SHA256:DHE-PSK-AES128-GCM-SHA256:AES128-GCM-SHA256:PSK-AES128-GCM-SHA2
56:AES256-SHA256:AES128-SHA256:ECDHE-PSK-AES256-CBC-SHA384:ECDHE-PSK-AES256-CBC-
SHA:SRP-RSA-AES-256-CBC-SHA:SRP-AES-256-CBC-SHA:RSA-PSK-AES256-CBC-SHA384:DHE-PS
K-AES256-CBC-SHA384:RSA-PSK-AES256-CBC-SHA:DHE-PSK-AES256-CBC-SHA:GOST2012-GOST8
912-GOST8912:GOST2001-GOST89-GOST89:AES256-SHA:PSK-AES256-CBC-SHA384:PSK-AES256-
CBC-SHA:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-CBC-SHA:SRP-RSA-AES-128-CBC
-SHA:SRP-AES-128-CBC-SHA:RSA-PSK-AES128-CBC-SHA256:DHE-PSK-AES128-CBC-SHA256:RSA
-PSK-AES128-CBC-SHA:DHE-PSK-AES128-CBC-SHA:AES128-SHA:PSK-AES128-CBC-SHA256:PSK-
AES128-CBC-SHA
причем появились и алгоритмы ГОСТ-2001 и ГОСТ-2012, также руками переписал в параметре OPENSSL_CONF
значение перменной на C:\Program Files\OpenSSL\bin\cnf\openssl.cnf, а в PATH изменения не вносил
далее проверяю подключена ли библиотека ГОСТ
C:\Program Files\OpenSSL\bin>openssl engine
(dynamic) Dynamic engine loading support
(gostengy) CryptoPro GostEngy ($Revision: 185515 $)
далее пытаюсь выполнить конвертацию (взял отсюда
http://pyatilistnik.org/crt-to-pfx/) сделанного ранее файла 123.pfx в файл key.pem
C:\Program Files\OpenSSL\bin>openssl.exe pkcs12 -in 123.pfx -nocerts -out key.pem
Enter Import Password:
Error outputting keys and certificates
6920:error:06074079:digital envelope routines:EVP_PBE_CipherInit:unknown pbe alg
orithm:crypto\evp\evp_pbe.c:95:TYPE=1.2.840.113549.1.12.1.80
6920:error:23077073:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 algor cipherinit err
or:crypto\pkcs12\p12_decr.c:41:
6920:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt err
or:crypto\pkcs12\p12_decr.c:94:
получаю следующие ошибки и самое неполнятное файл key.pem все же формируется и
если его открыть Notepad++,то внутри файла key.pem получается следующая конструкция:
Bag Attributes
localKeyID: 01 00 00 00
friendlyName: TEST1811TEST
Microsoft CSP Name: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider
Делаю проверку выгруженнгого с помощью КриптоПРО файла 123.pfx (взял отсюда )
c:\Program Files\OpenSSL\bin>openssl pkcs12 -info -in 123.pfx
Enter Import Password:
MAC: sha1, Iteration 2000
MAC length: 20, salt length: 20
PKCS7 Data
Shrouded Keybag: undefined, Iteration 2000
Bag Attributes
localKeyID: 01 00 00 00
friendlyName: TEST1811TEST
Microsoft CSP Name: Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provi
der
Error outputting keys and certificates
7160:error:06074079:digital envelope routines:EVP_PBE_CipherInit:unknown pbe alg
orithm:crypto\evp\evp_pbe.c:95:TYPE=1.2.840.113549.1.12.1.80
7160:error:23077073:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 algor cipherinit err
or:crypto\pkcs12\p12_decr.c:41:
7160:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt err
or:crypto\pkcs12\p12_decr.c:94:
У меня к форумчанам вопрос,что и где я сделал неправильно? Я пришёл только к нескольким выводам:
-или УЦ выпустил сертифкат с контейнером,который априори нельзя сконвертнуть в PEM (зашифрован или стоит некий признак,что контейнер нельзя конвертить);
-или я что-то упустил в настройках openssl;
-или полследняя версия openssl не может работать с ГОСТ-2012.
Сразу оговорюсь,что я параллельно пробывал широко разрекламированные на форумах (в том числе здеь
https://habr.com/post/275039/ ) утилиты
P12FromGostCSP (производитель ООО "Лисси-Софт") и privkey.exe (неизвестный производитель)
Прочитал много хвалебных слов про чудоутилиту, скачал P12FromGostCSP.exe и P12FromGostCSP_demo.exe c
http://ftp.lissi.ru/Utils/P12FromGOSTCSP/ . Попробовал
P12FromGostCSP.exe и на сколько я понял,но она с ГОСТ-2012 не работает в принципе(так как контейнер,выпущенный с использованием ГОСТ-2001, она подхватывает, а
контейнер,выпущенный с использованием ГОСТ-2012, он на не воспримает).Утилита P12FromGostCSP_demo.exe подхватывает контейнер,выпущенный
с использованием ГОСТ-2012,но выгрузка в файл возможна только в платной версии. Главное я не вычитал ни где,а какой файл *.pfx создаст: есть ли смысл её
использовать,так как она может сгенерить файл,аналогичный КриптоПРО и с ним опять нельзя выполнять конвертацию.
Утилита privkey.exe у меня не заработала.