- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Автор: ilimurzin

Источник [16]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/412538

Ссылки в тексте:

[1] Интеграция с ЕСИА v2 на Debian 11 + php 7: https://habr.com/ru/articles/736178/

[2] расширения для PHP от КриптоПро: https://docs.cryptopro.ru/cades/phpcades

[3] fr05t1k/esia: https://github.com/fr05t1k/esia

[4] в репозитории движка OpenSSL GOST Engine на гитхабе: https://github.com/gost-engine/engine/blob/master/INSTALL.md

[5] как я это делаю в CI: https://github.com/ilimurzin/esia/blob/2f2b42c7c042ec237a7738751935ab6997c81b5c/.github/workflows/check.yml#L32C11-L33C61

[6] в репозитории: https://github.com/ilimurzin/esia/blob/master/src/Esia/Signer/OpenSSLSigner.php

[7] через openssl dgst: https://github.com/ilimurzin/esia/blob/master/src/Esia/Signer/CliOpenSSLSigner.php

[8] передачи пароля: https://github.com/ilimurzin/esia/blob/2f2b42c7c042ec237a7738751935ab6997c81b5c/src/Esia/Signer/CryptoProSigner.php#L31

[9] выбирается по SHA1-хешу: https://github.com/ilimurzin/esia/blob/2f2b42c7c042ec237a7738751935ab6997c81b5c/src/Esia/Signer/CryptoProSigner.php#L21

[10] Команда: https://github.com/ilimurzin/esia/blob/2f2b42c7c042ec237a7738751935ab6997c81b5c/src/Esia/Signer/CliCryptoProSigner.php#L40

[11] пакет: https://github.com/ilimurzin/esia

[12] методические рекомендации: https://digital.gov.ru/ru/documents/6186/

[13] комментариях: https://habr.com/ru/articles/811389/#comment_26780543

[14] прошлым: https://habr.com/ru/companies/web3_tech/articles/666894/#comment_24361988

[15] публикациям: https://habr.com/ru/articles/499016/#comment_21541648

[16] Источник: https://habr.com/ru/articles/888000/?utm_source=habrahabr&utm_medium=rss&utm_campaign=888000