Сухая выдержка без мата “ЧТО ДЕЛАТЬ”.
Предполагается, что вы уже получили папку (например, “MySite.001”), содержающую файлы header.key, masks.key, masks2.key, name.key, primary.key, primary2.key.
Все это делаем под Windows 10.
- Покупаем софт у ЛИССИ P12FromGostCSP http://soft.lissi.ru/ls_product/utils/p12fromcsp/ (на момент написания статьи стоит 2990 руб)
- Ждем письмо, при необходимости скорости пишем им в саппорт, почта саппорта указана при покупке.
- Присылают письмо с лицензией и ссылкой на скачивание P12FromGostCSP и скачиваете его. Пока не запускаем.
- Копируете папку “MySite.001” на флешку (любую).
- Устанавливаем триальный КриптоПРО CSP.
- Запускаем “Инструменты КриптоПРО”.
- Переходим во вкладку Контейнеры, он подгрузит контейнер “MySite.001” с флешки (у него будет уже нормальное имя), жмем Импортировать. Пароль обычно 12345678.
- Запускаем P12FromGostCSP, он подгрузит ключ из КриптоПРО. Жмем Экспортировать, выбираем папку.
- Все, у вас есть корректный PFX файл, который содержит сертификат и закрытый ключ.
- Теперь устанавливайте docker (если его еще нет).
- Из директории где лежит p12.pfx выполняете команду (потребуется ввести пароль): docker run –rm -v `pwd`:`pwd` -w `pwd` -it rnix/openssl-gost openssl pkcs12 -in p12.pfx -nocerts -out key.pem -nodes
- В директории должен появиться закрытый ключ key.pem.
- Далее выполняете из той же директории команду: docker run –rm -v `pwd`:`pwd`-w `pwd` -it rnix/openssl-gost openssl pkcs12 -in p12.pfx -nokeys -out cert.pem
- Появится файл сертификата cert.pem.
- Далее необходимо сгенерировать публичный ключ из сертификата (необходим для проверки подписи): docker run –rm -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost openssl x509 -pubkey -noout -in cert.pem > pubkey.pem
- Готово, эти ключи понимает openssl с поддержкой ГОСТ-2012. Рекомендую использовать сборку php-fpm отсюда: https://github.com/rnixik/docker-openssl-gost
- Также потребуется применить эти файлы к вашему коду. Тут уже сами - у каждого свой код.
Для проверки используйте следующий код.
Подпись
Создайте файл с любым текстовым содержимым, например file.txt
:
Some Data
Далее необходимо подписать файл (выходом будет бинарный формат, поэтому делаем base64):
docker run --rm -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost openssl dgst -md_gost12_256 -sign key.pem file.txt | base64 > signed.txt
Проверяйте, что файл появился и у него есть содержимое.
Проверка
Далее, раскодируем из base64 в бинарный формат:
base64 -D -in signed.txt > signed.bin
И проверяем подпись, сравнивая с исходным файлом и подписью:
docker run --rm -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost openssl dgst -md_gost12_256 -verify pubkey.pem -signature signed.bin file.txt
////////////////
Также обратите внимание на этот репозиторий (сделал REST-сервис для подписи и проверки подписи): https://github.com/crusat/openssl-gost-rest
////////////////
Источник: боль, кровь и мои слезы.