Авторизация через Госуслуги

124
14 июля 2021, 05:30

Пробую сделать авторизацию через Госуслуги. Порядок подключения сайта понятен. Непонятно как работать с сертификатами.

Посмотрел несколько примеров реализации как на PHP (например https://github.com/fr05t1k/esia), так и на других языках.

Везде идет речь о сертификате (1 файл), о закрытом ключе (1 файл) и пароле к закрытому ключу (строка).

Что я имею из этого:

  • Пароль к закрытому ключу

  • Некие сертификаты, общедоступные по ссылке http://esia.gosuslugi.ru/public/esia.zip Я так понимаю что из них мне нужен только один, в зависимости от типа подписи.

  • Файлы, которые прислал заказчик (он же регистрировал сайт на Госуслугах).

Файлы от заказчика содержат один файл с расширением cer (Еще один сертификат?) и папку с несколькими файлами с расширением key (header.key, masks.key, primary.key и тд)

Вопросы: Как мне эти данные использовать? Какой из сертификатов мне нужен? Какой из файлов key - закрытый ключ? Или мне надо произвести какие-то действия и сгенерить из них закрытый ключ?

Answer 1

Разобрались в ситуации.

В итоге ключи, что прислал клиент (6 закрытых и 1 сертификат) могут быть импортированы только в криптопро. И работать с ними можно только с ПО криптопро (https://www.cryptopro.ru/). С их ПО получается только подписывать файлы, запросы - нет. Плюс это платно.

В итоге нашли докер контейнер, который умеет работать с ГОСТ шифрованием (https://github.com/rnixik/docker-openssl-gost/tree/master/php-fpm-gost). Сделали для него простой rest api для проксирования запросов к ЕСИА с использованием библиотеки (https://github.com/ekapusta/oauth2-esia)

Для работы с этой библиотекой необходимо преобразовать ключ и сертификат.

Ключ преобразовали с помощью этого https://github.com/garex/nodejs-gost-crypto Сертификат преобразовали с помощью этого https://ssl4less.ru/faq/ehniceskie-voprosy/onvertirovanie-sertifikatov-pem-p7b-pfx-der.html

Answer 2

Везде идет речь о сертификате (1 файл), о закрытом ключе (1 файл) и пароле к закрытому ключу (строка)

Для обмена с ЕСИА потребуется шифрование, поэтому у вас должен быть свой RSA-ключ для подписи. Закрытый ключ находится у вас, публичный сертификат выгружается в кабинет ЕСИА.

Некие сертификаты, общедоступные по ссылке http://esia.gosuslugi.ru/public/esia.zip

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

Файлы от заказчика содержат один файл с расширением cer

Скорей всего - это публичный сертификат. Можете попробовать его открыть. В windows должно открыться стандартное окно с информацией о сертификате.

и папку с несколькими файлами с расширением key (header.key, masks.key, primary.key и тд)

А вот тут сказать сложно. Похоже, что клиент сгенерировал ключ на флешке средствами крипто-про или наподобие, а потом просто скопировал каталог. Вот тут он не прав. Надо выяснять конкретные требования заказчика по интеграции

Для авторизации через госуслуги можно использовать, например, самоподписанные сертификаты:

Сначала создать закрытый ключ и запрос на сертификат

openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr -sha256

в процессе генерации будет запрос на воод пароля к закрытому ключу.

Потом выпустить публичный сертификат для него

openssl x509 -signkey domain.key -in domain.csr -req -days 1825 -out domain.crt -sha256

у вас будет два файла domain.key (закрытый ключ) и domain.crt (сертификат). Сертификат потом надо будет выгрузить в кабинет ЕСИА.

Как мне эти данные использовать?

Очень помог в интеграции с ЕСИА пакет https://github.com/ekapusta/oauth2-esia Описание работы с ним https://habr.com/ru/post/358834/

Кстати, если посмотрите тесты на гитхабе, то найдете там мнемонику для тестовой организации и готовые ключи для нее. Можно будет протестировать.

READ ALSO
Symfony 4: обновление ролей

Symfony 4: обновление ролей

Столкнулся со следующей проблемой: когда изменяю права/роли у пользователя, то ему необходимо перезайти в свой аккаунт, чтобы они обновилисьМожно...

115
Насколько необходимы Custom Exception?

Насколько необходимы Custom Exception?

Я так понимаю, хорошим тоном является под каждый вид исключения делать свой собственный класс

101
Удалить все файлы через 3 дня на сервере

Удалить все файлы через 3 дня на сервере

Нужно удалить все файлы и папки рекурсивно на сервереДоступ по FTP

110
Оптимизация выборки из бд PHP

Оптимизация выборки из бд PHP

Есть примерно 80 таблиц с данными по которым идёт поиск значений через foreach, и пока он идёт успевает пройти секунд 10-15 так как много таблиц,...

97