Интеграция с ЕСИА на базе oauth2-client (PHP)

Интеграция с ЕСИА на базе oauth2-client (PHP)

Только истинный криптонец способен сделать интеграцию с ключами из Crypto Pro

С 2020 года алгоритм RSA заменили алгоритмом ГОСТ-2012. Покажу пример интеграции сайта с гос услугами на php.

При интеграции с ЕСИА вы должны получить от заказчика файлы закрытого и открытого ключа. Если делали ключ через небезызвестный центр выдачи сертификатов Crypto Pro то вам должны были прислать 6 файлов контейнера закрытого ключа (header.key, masks.key, masks2.key, name.key, primary.key, primary2.key) и открытый ключ сертификата в формате .cer.

Для интеграции использовал пакет https://github.com/ekapusta/oauth2-esia.

Для использования пакета вам нужно преобразовать .cer в .crt. Делается это через стандартный openss вот такой командой:openssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt

Если так выдает ошибку используйте -inform PEM.

Далее вам нужно преобразовать файлы закрытого ключа (6 файлов) в один ключ private.key. Утилита Crypto Pro позволяет получить pkcs12 с внутренними алгоритмами шифрования, чтобы получить pkcs12 с гостовскими алгоритмами нужно использовать проприетарщину (сторонний софт) или пробовать через c++ получить нужный формат. Под проприетарщиной имею ввиду утилиту P12FromGostCSP от компании lissi. Стоит это удовольствие 2000 рублей, установив утилиту и сертификат с ключом вы сможете получить через нее файл pfx в pkcs12 с понятными гостовскими алгоритмами шифрования.

Далее вам необходимо завести openssl с gostengine (поддержка гостовских алгоритмов). Я это делал на ubuntu ибо там понятнее. На просторах интернета найдете как завести это дело. Далее кидаете на ubuntu ваш файл pfx. С помощью команды openssl pkcs12 -in p12.pfx -out private.key.pem получаете файл с сертификатом и ключом. Из файла pem вас интересует только блок BEGIN PRIVATE KEY —END PRIVATE KEY. Это и есть необходимы для подписи для пакета интеграции файл закрытого ключа private.key.

Теперь у вас есть файл сертификата и ключа в нужных для интеграции форматах. Чтобы завести пакет https://github.com/ekapusta/oauth2-esia по гостовским алгоритмам вам нужна поддержка на хостинге гостовских алгоритмов, если у вас хост поддерживает их то компилите php с этими алгоритмами, если нет то рекомендую использовать docker контейнер rnix/openssl-gost и включить настройку toolpath: docker run --rm -i -v $(pwd):$(pwd) -w $(pwd) rnix/openssl-gost openssl.

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

У этой записи 9 комментариев

  1. а дайте код, пожалуйста, особенно где Вы указываете настройку toolpath

    1. ‘signer’ => new OpensslCli(‘/path/to/public/certificate.cer’, ‘/path/to/private.key’, ‘docker run —rm -i -v $(pwd):$(pwd) -w $(pwd) rnix/openssl-gost openssl’);
      Параметры OpensslCli посмотрите, там еще password вроде есть. Сам код в ссылке на ekapusta в статье.

  2. Здравствуйте, не могли бы вы кое-что пояснить? Вы написали:
    » Из файла pem вас интересует только блок BEGIN PRIVATE KEY —END PRIVATE KEY. Это и есть необходимы для подписи для пакета интеграции файл закрытого ключа private.key»
    Я правильно понимаю, что нужно этот блок скопировать, вставить в текстовый редактор и сохранить файл как private.key?

    Создаю экземпляр провайдера с таким сайнером
    ‘signer’ => new OpensslCli(
    ‘open.crt’, // Открытый ключ .cer преобразованный в .crt
    ‘private.key’, // Ключ, выдранный из private.key.pem текстовым редактором
    «»,
    ‘docker run —rm -i -v $(pwd):$(pwd) -w $(pwd) rnix/openssl-gost openssl’
    )
    При вызове $provider->getAuthorizationUrl()
    Получаю ошибку Sign failed as of: Operation failed with code#3 as of: unable to load signing key file

    1. Да, текст ключа из блока сертификата от begin до end, тут важно как получали файл с ключом, в статье описано преобразование через lissy

  3. Да, я через lissi преобразовывал. Метки BEGIN и END тоже ведь должны присутствовать в ключе или только то, что между ними?
    И ещё подскажите пожалуйста, в личном кабинете организации на стороне ЕСИА сертификат нужно загружать в формате crt или cer?

    1. Да, метки должны присутствовать, в личном кабинете ЕСИА загружается оригинальный сертификат — cer

  4. >> про особенности использования тестового режима и рабочего писать не буду, об этом уже много сказано, но сначала делается на тестовых данных. Тестовые параметры подключения узнаете у заказчика и гос услуг.

    Спасибо за статью. Подскажите, где можно посмотреть про особенности тестового режима?
    Заказчик прислал для тестового доступа ровно аналогичные по структуре папки, аж 3 штуки (каждая содержит header.key, masks.key, masks2.key, name.key, primary.key, primary2.key + сертификат).

    КриптоПро при этом может быть на кого угодно зарегистрирована или на ту компанию, на которую выдан ключ?

    1. Описание как использовать тестовый режим есть на портале гос услуг, также уточняются параметры у заказчика, и есть примеры тестового режима с описанием в исходниках библиотеки ekapusta. По регистрации крипто про не могу сказать, так как ее приходилось обходить (ее алгоритмы не подходили).

Добавить комментарий

Закрыть меню