Чиним вход через ЕСИА с ГОСТ-2012

Сухая выдержка без мата “ЧТО ДЕЛАТЬ”.

Предполагается, что вы уже получили папку (например, “MySite.001”), содержающую файлы header.key, masks.key, masks2.key, name.key, primary.key, primary2.key.

Все это делаем под Windows 10.

  1. Покупаем софт у ЛИССИ P12FromGostCSP http://soft.lissi.ru/ls_product/utils/p12fromcsp/ (на момент написания статьи стоит 2990 руб)
  2. Ждем письмо, при необходимости скорости пишем им в саппорт, почта саппорта указана при покупке.
  3. Присылают письмо с лицензией и ссылкой на скачивание P12FromGostCSP и скачиваете его. Пока не запускаем.
  4. Копируете папку “MySite.001” на флешку (любую).
  5. Устанавливаем триальный КриптоПРО CSP.
  6. Запускаем “Инструменты КриптоПРО”.
  7. Переходим во вкладку Контейнеры, он подгрузит контейнер “MySite.001” с флешки (у него будет уже нормальное имя), жмем Импортировать. Пароль обычно 12345678.
  8. Запускаем P12FromGostCSP, он подгрузит ключ из КриптоПРО. Жмем Экспортировать, выбираем папку.
  9. Все, у вас есть корректный PFX файл, который содержит сертификат и закрытый ключ.
  10. Теперь устанавливайте docker (если его еще нет).
  11. Из директории где лежит p12.pfx выполняете команду (потребуется ввести пароль): docker run –rm -v `pwd`:`pwd` -w `pwd` -it rnix/openssl-gost openssl pkcs12 -in p12.pfx -nocerts -out key.pem -nodes
  12. В директории должен появиться закрытый ключ key.pem.
  13. Далее выполняете из той же директории команду: docker run –rm -v `pwd`:`pwd`-w `pwd` -it rnix/openssl-gost openssl pkcs12 -in p12.pfx -nokeys -out cert.pem
  14. Появится файл сертификата cert.pem.
  15. Далее необходимо сгенерировать публичный ключ из сертификата (необходим для проверки подписи): docker run –rm -v `pwd`:`pwd` -w `pwd` rnix/openssl-gost openssl x509 -pubkey -noout -in cert.pem > pubkey.pem
  16. Готово, эти ключи понимает openssl с поддержкой ГОСТ-2012. Рекомендую использовать сборку php-fpm отсюда: https://github.com/rnixik/docker-openssl-gost
  17. Также потребуется применить эти файлы к вашему коду. Тут уже сами - у каждого свой код.

Для проверки используйте следующий код.

Подпись

Создайте файл с любым текстовым содержимым, например 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

////////////////

Источник: боль, кровь и мои слезы.

openssl