- PVSM.RU - https://www.pvsm.ru -
Снова коснусь темы, по которой на Хабре уже выходило несколько публикаций: интеграция с ЕСИА. Сначала будет несколько особенностей, которые раньше не были описаны, а в конце будет грустный вывод.
В публикации «Интеграция с ЕСИА 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
Нажмите здесь для печати.