Вход на сайт через Госуслуги на PHP

в 4:15, , рубрики: php, госуслуги, есиа

Снова коснусь темы, по которой на Хабре уже выходило несколько публикаций: интеграция с ЕСИА. Сначала будет несколько особенностей, которые раньше не были описаны, а в конце будет грустный вывод.

В публикации «Интеграция с ЕСИА v2 на Debian 11 + php 7» автор пошел по пути использования расширения для PHP от КриптоПро для подписания запросов и поддержал эндпоинт v2/ac только для этого варианта подписания. При этом в оригинальном пакете fr05t1k/esia была возможность подписывать запросы при помощи OpenSSL.

Я решил поддержать возможность подписывать запросы через OpenSSL, а также при помощи КриптоПро без установки расширения.

Чтобы подписать запрос при помощи OpenSSL, нужно добавить ему поддержку ГОСТ. Инструкция по установке есть в репозитории движка OpenSSL GOST Engine на гитхабе. По этой инструкции у меня удалось добавить поддержку ГОСТ даже на макбуке. Для убунты процесс еще проще, и если коротко сводится к установке пакета libengine-gost-openssl1.1 и изменении конфига /usr/lib/ssl/openssl.cnf, можно посмотреть как я это делаю в CI.

Далее подписание сводится к вызову двух команд: $privateKey = openssl_pkey_get_private(file_get_contents($this->privateKeyPath), $this->privateKeyPassword); и openssl_sign($message, $signature, $privateKey, 'md_gost12_256');. Подпись запишется в переменную $signature. Полностью, с обработкой ошибок, пример можно посмотреть в репозитории. Там же есть вариант через openssl dgst, используя exec. Полученную подпись нужно еще закодировать в base64 url safe.

Для КриптоПро способ такой же, как в публикации «Интеграция с ЕСИА v2 на Debian 11 + php 7», только еще добавляется вызов $certificate->PrivateKey()->set_KeyPin($this->pin); для передачи пароля закрытого контейнера, а сертификат выбирается по SHA1-хешу, а не полю Subject.

Чтобы подписать запрос через КриптоПро не устанавливая расширение для PHP, можно вызвать утилиту csptest через exec. Команда будет выглядеть так:

$command = "csptest -keyset -sign GOST12_256 -container $container -keytype exchange -in $messageFilePath -out $signatureFilePath";

Где $container — имя контейнера (можно узнать командой certmgr -list).

Отлично! Мы разобрались как формировать подпись запросов к ЕСИА четырьмя способами. Все работает, но прежде чем оформить весь полученный код в пакет, которым могли бы воспользоваться другие разработчики, я решил перечитать методические рекомендации и проверить все ли параметры используются правильно.

И только в этот момент, на странице 507, я заметил такое требование: «Разработчик технического решения должен обеспечить проведение процедуры оценки влияния на применяемые СКЗИ». Как оказалось, собственное решение должно пройти процедуру оценки влияния на СКЗИ, и об этом уже писали в комментариях к прошлым публикациям. Процедура довольно муторная, проще перейти на готовое решение.

Грустный вывод

В итоге мы получили поддержку нового эндпоинта ЕСИА v2/ac на PHP с возможностью подписать запрос через OpenSSL, а также оформили полученный код в пакет, но использовать пакет у нас не получится, потому что в таком случае наше решение должно пройти процедуру оценки влияния, а это процедура довольно муторная, и проще взять готовое решение. Урок о важности чтении документации и комментариев к статьям мною усвоен... Надеюсь, что созданный в процессе пакет поможет кому-то в целях обучения, а может даже войдет в состав какого-нибудь сертифицированного решения...

Автор: ilimurzin

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js