Снова коснусь темы, по которой на Хабре уже выходило несколько публикаций: интеграция с ЕСИА. Сначала будет несколько особенностей, которые раньше не были описаны, а в конце будет грустный вывод.
В публикации «Интеграция с ЕСИА v2 на Debian 11 + php 7» автор пошел по пути использования расширения для PHP от КриптоПро для подписания запросов и поддержал эндпоинт v2/ac только для этого варианта подписания. При этом в оригинальном пакете fr05t1k/esia была возможность подписывать запросы при помощи OpenSSL.
Я решил поддержать возможность подписывать запросы через OpenSSL, а также при помощи КриптоПро без установки расширения.
Чтобы подписать запрос при помощи OpenSSL, нужно добавить ему поддержку ГОСТ. Инструкция по установке есть в репозитории движка OpenSSL GOST Engine на гитхабе. По этой инструкции у меня удалось добавить поддержку ГОСТ даже на макбуке. Для убунты процесс еще проще, и если коротко сводится к установке пакета libengine-gost-openssl1.1
и изменении конфига , можно посмотреть lib 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