Для памяти с big-town.narod.ru/openssl.html
Вы наверное уже тоже столкнулись с ситуацией когда требуется подписать или зашифровать какой либо файл и по требованием ФСБ это должен быть ГОСТ-овский алгоритм. И конечно бесплатной альтернативы КриптоПРО найти не удавалось. Да и вообще надо сказать что это не самый гибкий инструмент. А если вы еще и *nix системы используете, то тут вообще беда. И наконец то это совершилось! Вышел openssl-1.0 именно с этой верси появилась встроеная поддержка ГОСТ-овских алгоритмов. В версии 1.0.1 ГОСТ уже включен по умолчанию. В этом файле вы можете прочитать как включить поддержку ГОСТ openssl-1.0.2-stable-SNAP-20131130/engines/ccgost/README.gost Если в кратце то находим наш конфиг обычно это /etc/ssl/openssl.cnf И добавляем строки в файл
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 ciphers | tr ":" "\n" | grep -i gost GOST2001-GOST89-GOST89 GOST94-GOST89-GOST89
Теперь наша задача вытащить контейнер с закрытым ключом с нашего хранилища. В этом нам очень поможет утилита P12FromGostCSP. Сохраним его например
. Так же нам понадобиться сертификат получателя. Обычно они сохраняются в формате DER и имеют расширение .cer пусть в нашем случае это будет
. Как определить в каком формате сертификат DER или PEM ? Очень просто достаточно его открыть в любом текстовом редакторе. И если есть начальный тег "-----BEGIN CERTIFICATE-----" это PEM. Теперь нам необходимо переконвертировать наш ключ и сертификат в PEM. Для этого
openssl pkcs12 -in p12.pfx -nodes # Поглядим все ли там есть openssl pkcs12 -in p12.pfx -out key.pem -nodes -clcerts # Конвертируем
Аналогично для сертификата
openssl x509 -inform der -in cert.cer -out cert.crt
Ну дальше собственно без коментариев, в примере подопытный файл
openssl smime -sign -signer key.pem -engine gost -gost89 -binary -noattr -outform DER -in 1.txt -out 1.txt.sig
./openssl smime -encrypt -engine gost -gost89 -binary -noattr -outform DER -in 1.txt -out 1.txt.enc cert.crt
Подписываем и шифруем одновременно
openssl smime -sign -signer key.pem -engine gost -gost89 -binary -noattr -outform DER -nodetach -in 1.txt | \ openssl smime -encrypt -engine gost -gost89 -binary -noattr -outform DER -out 1.txt.sig.enc cert.crt
./openssl smime -decrypt -engine gost -gost89 -binary -noattr -inform DER -in 1.txt.enc -out 1dec.txt.enc -inkey recivekey.pem
recivekey.pem - это закрытый ключ получателя. Кому принадлежит сертификат cert.crt Немного о параметрах
smime - тип сообщения -sign - указываем что надо подписать -encrypt - указываем что надо шифровать -decrypt - указываем что надо расшифровать -signer - указываем приватный ключ из которого генериться подпись -engine - движок госта -gost89 - указываем какой алгоритм использовать -binary - говорим что файл будет двоичный -noattr - не вкладывать дополнительные атрибуты -outform - какую кодировку пользовать DER или PEM -nodetach - не отсоединять подпись -in - входной файл -out - выходной файл -inkey - приватный ключ
И еще маленький бонус как быстро подписать файл имея только КриптоПРО. Делаем bat-файл например
if NOT $1 == "" ( Диск:\Путь установки КриптоПРО\csptest.exe -sfsign -sign -in $1 -out $1.sig -my "Имя сертификата в контейнере личные" )
C:\Users\<Имя Пользователя>\AppData\Roaming\Microsoft\Windows\SendTo
C:\Documents and setting\<Имя Пользователя>\SendTo
- для winxp. Для подиси нажимаем правой клавишей на файле который хотим подписать
"Отправить - > Подписать"
и в этой же папке появится подписанный файл с расширением