Как стать автором
Поиск
Написать публикацию
Обновить

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

Время на прочтение2 мин
Количество просмотров5K

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

В публикации «Интеграция с ЕСИА 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, а также оформили полученный код в пакет, но использовать пакет у нас не получится, потому что в таком случае наше решение должно пройти процедуру оценки влияния, а это процедура довольно муторная, и проще взять готовое решение. Урок о важности чтении документации и комментариев к статьям мною усвоен... Надеюсь, что созданный в процессе пакет поможет кому-то в целях обучения, а может даже войдет в состав какого-нибудь сертифицированного решения...

Теги:
Хабы:
Всего голосов 14: ↑13 и ↓1+17
Комментарии9

Публикации

Ближайшие события