При выполнении очередного госзаказа наша команда столкнулась с проблемой интеграции сайта с ЕСИА. Инструкции по решению этой задачи в сети нет, кроме информации в официальных документах МинКомСвязи (примерно 300 страниц в трех регламентах). Также есть компании, которые оказывают платные услуги по интеграции ЕСИА. Мы реализовали, описали процесс интеграции и решили поделиться с сообществом habrahabr.
Что такое ЕСИА
Единая Система Идентификации и Аутентификации — российская информациия система, обеспечивающая доступ (регистрация, аутентификация) на сайты государтсвенных структур и некоторых коммерческих организаций. Подробнее на википедии
В процессе интеграции ЕСИА, система сможет отправлять запрос на ЕСИА и при успешной авторизации получать в качестве ответа данные пользователя
Сценарий авторизации выглядит примерно так:
- Пользователь на сайте, на котором внедряется ЕСИА, в личном кабинете нажимает на кнопку «Войти через ГосУслуги»
- Система переадресует на сайт ЕСИА
- Пользователь вводит свои логин и пароль на сайте ЕСИА
- При успешной авторизации ЕСИА возвращает пользователя обратно на сайт и по защищенному протоколу передает его личные данные
Содержание
- Общие сведения
- Установка SimpleSAMLphp
- Настройка SimpleSAMLphp для подключения к тестовой среде ЕСИА
- Конфигурация файла метаданных
- Отправка заявки в адрес МинКомСвзяи на подключение ИС к тестовой среде ЕСИА
- Функциональная интеграция с ЕСИА и получение данных авторизированных пользователей через ЕСИА
- Отправка заявки на подключение ИС к продуктивной среде ЕСИА
Общие сведения
На сайте МинКомСвязи размещен документ, именуемый «Методические рекомендации по использованию Единой системы идентификации и аутентификации», последнюю актуальную версию всегда можно найти на сайте МинКомСвязи. Документ сам по себе немаленький — почти 200 страниц, и, конечно же мало кто захочет его подробно изучать, да и понятен он будет не всем желающим, поэтому опишу тут процесс в сухом остатке.
Подключить ИС к ЕСИА возможно двумя способами:
- Посредством стандарта SAML 2.0
- На базе подхода REST
Если сравнивать 2 подхода, то по факту разницы между ними большой нет, есть несколько плюсов у способа на базе подхода REST. Есть ребята, которые на мой взгляд за немалые деньги подключают ЕСИА и о преимуществах REST они написали тут.
Но для подавляющего большинста случаев первый подход охватывает все необходимые функции. Поэтому расскажу о внедрении ЕСИА посредством SAML 2.0
Установка SimpleSAMLphp
Для интеграции будем использовать SimpleSAMLphp. Если система, которую вы настраиваете написана не на PHP, то все равно можно использовать этот модуль, просто на вашем сайте будет функция аутентификации реализована на php, данные от ЕСИА вы получите в xml формате.
Последняя официальная версия SimplSAMLphp доступна на официальном сайте SimpleSamlPHP. Скачиваете архив, распаковываете модуль в папку /var.В целях безопасности для папки с разархивированным модулем необходимо настроить права доступа только для root пользователя. В конфигурации сервера необходимо добавить алиас и следующие правила:
<VirtualHost *>
ServerName service.example.com
DocumentRoot /var/www/service.example.com
SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/simplesamlphp/config
Alias /simplesaml /var/simplesamlphp/www
<Directory /var/simplesamlphp/www>
<IfModule !mod_authz_core.c>
# For Apache 2.2:
Order allow,deny
Allow from all
</IfModule>
<IfModule mod_authz_core.c>
# For Apache 2.4:
Require all granted
</IfModule>
</Directory>
</VirtualHost>
Суть в том, чтобы по запросу ServerName/simplesaml
открывалась приветственная страница simplesaml. Если вы все сделали правильно, то по запросу ServerName/simplesaml
вы увидите такую страничку
Настройка SimpleSAMLphp для подключения к тестовой среде ЕСИА
Для интеграции необходимы сертификат (cert.crt
) и ключ (key.key
). Важно(!) с ГОСТовским сертфикатом ничего не выйдет, можно получить бесплатный сертификат, погуглив как это делается, либо выпустить сертификат самому. Ключ и сертификат кладем в папку simplesamlphp/cert
Для конфигурации SimpleSAMLphp необходимо отредактировать следующие файлы:
simplesamlphp/config/config.php
simplesamlphp/config/authsources.php
simplesamlphp/metadata/saml20-idp-remote.php
Важное замечание — время на сервере не должно отличаться от времени ЕСИА больше 1 минуты.
simplesamlphp/config/config.php
:
//путь к папке с сертификатом и ключом относительно директории simplesamlphp
'certdir' => 'cert/'
// соль
'secretsalt' => 'defaultsecretsalt',
//Контакты администратора
'technicalcontact_name' => 'Familiya Imya',
'technicalcontact_email' => 'po4ta@domen.zone',
Важно знать, есть ли у системы entityID, если его нет, то в поле 'entityID'
необходимо указать адрес системы
simplesamlphp/config/authsources.php
:
esia' => array (
'saml:SP',
'name' => 'Esia',
//файл закрытого ключа
'privatekey' => 'key.key',
//пароль ключа
'privatekey_pass' => '12345678',
//сертификат открытого ключа
'certificate' => 'cert.crt',
//идентификатор системы,
'entityID' => 'ServerName',
'discoURL' => NULL,
'redirect.sign' => TRUE,
'redirect.validate' => TRUE,
'validate.logout' => FALSE,
//idp поставщика услуг для тестовой среды
'idp' => 'https://esia-portal1.test.gosuslugi.ru/idp/shibboleth',
//idp поставщика услуг для продуктивной среды
// 'idp' => 'https://esia.gosuslugi.ru/idp/shibboleth',
//Наименование организации
'OrganizationName' => 'Organization Name',
//url организации
'OrganizationURL' => 'ServerName',
Теперь надо получить подпись для нашего сертификата (fingerprint). Это можно сделать в терминале одной из команд
openssl x509 -noout -fingerprint -in "cert.crt" SHA1
sha1sum cert.crt
simplesamlphp/metadata/saml20-idp-remote.php
:
// idp поставщика услуг для тестовой среды
$metadata['https://esia-portal1.test.gosuslugi.ru/idp/shibboleth'] = array(
'name' => array(
'en' => 'Esia',
'no' => 'ESIA',
),
//idp SignOn поставщика услуг
'SingleSignOnService' => 'https://esia-portal1.test.gosuslugi.ru/idp/profile/SAML2/Redirect/SSO',
//idp LogOut поставщика услуг
'SingleLogoutService' => 'https://esia-portal1.test.gosuslugi.ru/idp/profile/SAML2/Redirect/SLO',
//Fingerprint сертификата
'certFingerprint' => 'f17393ae5927293ae5927261b6515c44501e4450',
);
Конфигурация файла метаданных
Теперь необходимо сгонфигурировать файл метаданных для того, чтобы его отправить вместе с заявкой в ЕСИА
Файл метаданных доступен по ссылке: ServerName/simplesaml/module.php/saml/sp/metadata.php/esia?output=xhtml
Пример файла метаданных:
<?xml version="1.0"?>
<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" entityID="ServerName">
<md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol" AuthnRequestsSigned="true">
<md:KeyDescriptor use="signing">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509Certificate>
//Сертификат
</ ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</md:KeyDescriptor>
<md:KeyDescriptor use="encryption">
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509Data>
<ds:X509Certificate>
//Сертификат
</ ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</md:KeyDescriptor>
<md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="ServerName/simplesaml/module.php/saml/sp/saml2-logout.php/esia"/>
<md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="ServerName/simplesaml/module.php/saml/sp/saml2-acs.php/esia" index="0"/>
<md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:browser-post" Location="ServerName/simplesaml/module.php/saml/sp/saml1-acs.php/esia" index="1"/>
<md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" Location="ServerName/simplesaml/module.php/saml/sp/saml2-acs.php/esia" index="2"/>
<md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" Location="ServerName/simplesaml/module.php/saml/sp/saml1-acs.php/esia/artifact" index="3"/>
</md:SPSSODescriptor>
<md:Organization>
<md:OrganizationName xml:lang="en">Organization Name</md:OrganizationName>
<md:OrganizationDisplayName xml:lang="en">Organization Name</md:OrganizationDisplayName>
<md:OrganizationURL xml:lang="en">ServerName</md:OrganizationURL>
</md:Organization>
<md:ContactPerson contactType="technical">
<md:GivenName>Imya</md:GivenName>
<md:SurName>Familiya</md:SurName>
<md:EmailAddress>po4ta@domen.zone</md:EmailAddress>
</md:ContactPerson>
</md:E</ntityDescriptor>
Но, к сожалению, SimpleSaml формирует файл метаданных, который немного отличается от требования ЕСИА, поэтому необходимо его подкорретировать в соотвествии с рекомендациями пункт А.6 Шаблон файла метаданных
Пример файла метаданных, удовлетворяющий требованиям ЕСИА, может скачать по ссылке example.xml
Отправка заявки в адрес МинКомСвзяи на подключение ИС к тестовой среде ЕСИА
Теперь формируем заявку по форме «E» Регламента информационного взаимодействия Участников с Оператором ЕСИА. Форму заявки в формате docx можете скачать с нашего сайта по ссылке.
Теперь необходимо отправить заявку на почту esia@minsvyaz.ru
с темой «Интеграция тестовой ЕСИА» и к письму необходимо приложить три файла:
- скан заявки в формате pdf,
- сертификат в формате crt
- файл метаданных xml
После получения ответа от поставщика услуг (ЕСИА) со статусом «Решен» и приложенными файлами для тестирования, переходим к следующему шагу.
Возможно Вам придет ответ с темой «Требуется дополнительная информация по запросу #», в этом случае в письме будет информация о том, что необходимо исправить.
Функциональная интеграция с ЕСИА и получение данных авторизированных пользователей через ЕСИА
Проверить подключения ИС к тестовой среде можно по ссылке
ServerName/simplesaml/module.php/core/authenticate.php?as=esia
.
При корректном выполнении всех предыдущих пунктов по ссылке откроется страница с тестовой средой ЕСИА. Для аутентификации в тестовой среде используются данные, полученные от ЕСИА в письме со статусом «Решен». После аутентификации произойдет переход на страницу SimpleSAML с таблицей с полученными данными от ЕСИА.
Теперь напишем скрипт, который будет обрабатывать данные. Для начала добавим кнопку для авторизации на сайт.
//в аттрибуте action указываем путь к файлу с будущим обработчиком данных
<form action="inc/esia.php" method="POST">
<input name="esia" type="submit" value="Войти через Госуслуги"/>
</form>
Обработчик inc/esia.php
. Тут мы получаем данные и можем записать их в базу, добавить в сессию и т.д. Вообще надо правильно парсить xml. Сейчас просто выведем данные на экран.
if (isset($_POST['esia'])){
//Настраиваем путь до simplesamlphp/lib/_autoload.php
require_once('../../simplesamlphp/lib/_autoload.php');
$as = new SimpleSAML_Auth_Simple('esia');
$as->requireAuth();
$attributes = $as->getAttributes();
foreach($attributes as $key => $value) {
echo ($key . ' ' . $value . '<br/>');
}
}
Отправка заявки на подключение ИС к продуктивной среде ЕСИА
Теперь формируем заявку по форме «М» Регламента информационного взаимодействия Участников с Оператором ЕСИА. Она не сильно отличается от формы Е, но внимательно изучите форму, необходимо в форме добавить запрашиваемые данные и уже не надо прикреплять файл сертификата.
В файлах simplesamlphp/config/authsources.php
, simplesamlphp/metadata/saml20-idp-remote.php
необходимо заменить idp поставщика услуг с Тестовой среды на продуктивную:
//idp поставщика услуг для тестовой среды
// 'idp' => 'https://esia-portal1.test.gosuslugi.ru/idp/shibboleth',
//необходимо заменить на idp поставщика услуг для продуктивной среды
'idp' => 'https://esia.gosuslugi.ru/idp/shibboleth',
Теперь формируем новый файл метаданных, по факту меняются только ссылки в полях Service
По адресу esia@minsvyaz.ru отправляем письмо и прикрепляем 2 файла:
- Новый файл метаданных
- Заявку по форме М
Теперь вы должны получить ответ со статусом «Решен», после этого можете вводить функцию входа через ЕСИА в эксплуатацию.
На момент написания статьи актуальная версии Регламента — 2.7. При обновлении регламента возможны некоторые изменения во взаимодействии ИС с ЕСИА.
Автор: denjoy