Вы наверное уже тоже столкнулись с ситуацией когда требуется подписать или зашифровать какой либо файл и по требованием ФСБ это должен быть ГОСТ-овский алгоритм. И конечно бесплатной альтернативы КриптоПРО найти не удавалось. Да и вообще надо сказать что это не самый гибкий инструмент. А если вы еще и *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. Сохраним его например p12.pfx. Так же нам понадобиться сертификат получателя. Обычно они сохраняются в формате DER и имеют расширение .cer пусть в нашем случае это будет cert.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
Ну дальше собственно без коментариев, в примере подопытный файл 1.txt

Подписываем:

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-файл например Подписать.bat с содержимым
if NOT $1 == "" (
Диск:\Путь установки КриптоПРО\csptest.exe -sfsign -sign -in $1 -out $1.sig -my "Имя сертификата в контейнере личные"
) 
Кидаем его в папку C:\Users\<Имя Пользователя>\AppData\Roaming\Microsoft\Windows\SendTo - для win7 или C:\Documents and setting\<Имя Пользователя>\SendTo - для winxp. Для подиси нажимаем правой клавишей на файле который хотим подписать "Отправить - > Подписать" и в этой же папке появится подписанный файл с расширением .sig.