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