Как расшифровать esia и как подключить свой сайт к “Госуслугам” и зачем это вообще делать

Что будет если взломали Госуслуги?

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

Как расшифровывается ЕСИА?

Единая система идентификации и аутентификации (ЕСИА)

Что значит ЕСИА?

Что такое учетная запись (ЕСИА)?

Как настроить ЕСИА?

Для добавления этого шага необходимо: Перейти во вкладку «Аутентификация» и выбрать сценарий аутентификации, назначенный на поставщика идентификации ЕСИА Нажать кнопку «Добавить исполнение», выбрать ESIA Organization Choice и нажать «Сохранить». Если он уже создан, то необходимо вносить данные в существующий

Как подтвердить ЕСИА через Сбербанк?

  • Шаг 1. Войдите в СберБанк Онлайн В поисковой строке введите «Регистрация на Госуслугах».
  • Шаг 2. Проверьте и заполните личные данные: СНИЛС
  • Шаг 3. Подтвердите регистрацию с помощью бесплатного СМС С номера 0919 вам придёт СМС с кодом подтверждения от Госуслуг.
  • Шаг 4. Дождитесь уведомления со статусом регистрации

Как подключить сайт организации или другую IT-систему к ЕСИА

Следующий шаг на пути интеграции с сервисом требует привлечения специалистов с технической
квалификацией в области информационной безопасности. Чтобы подключить сайт или другую IT-систему
к сервису, необходимо сгенерировать криптографический ключ и соответствующий ему сертификат.

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Сертификат передается государству. В ответ Минкомсвязи высылает разрешение на тестовый доступ
к сервису и данные для пробного подключения.

Далее следуют работы по разработке и настройке коннектора между IT-системой организации
инфраструктурой сервиса. Разработчикам предстоит научить их взаимодействовать между собой — принимать
и отправлять запросы в автоматическом режиме. Минкомсвязи даст разрешение на полноценный запуск
IT-системы только после того, как коннектор стабильно заработает в тестовом режиме.

Какой протокол использовать для подключения к ЕСИА и чем он отличается
от стандартов

Для интеграции сайта или IT-системы с ЕСИА используется сочетание авторизации по OAuth 2.0 и аутентификации при помощи OpenID Connect. Это распространенные решения с подробной
документацией и многочисленными примерами использования, но применить их для интеграции
с сервисом «как есть» не получится.

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Хотя создатели сервиса в целом придерживались стандартных спецификаций, им пришлось разработать
собственный Application Programming Interface для приема электронных подписей. Чтобы подключение
к ЕСИА было успешным, стандартным библиотекам OpenID/OAuth необходима ручная доработка.

Какой сертификат нужен для регистрации системы в ЕСИА
и обязательно ли использовать ГОСТ-криптографию?

В октябре 2019 года Минкомсвязи обновило методические
рекомендации
, исключив из них
упоминания стандарта шифрования RSA (Rivest, Shamir и Adleman) и самоподписанных сертификатов.
Их использование больше не допускается.

Теперь российские алгоритмы шифрования ГОСТ Р 34.10-2012 и ГОСТ Р 34.11-2012 —
единственные стандарты, которые доступны для использования с ЕСИА.

Сертификаты обязательно должны быть выпущены сертифицированным удостоверяющим центром.

Какие готовые решения можно использовать для подключения

В отдельных отечественных системах управления сайтами предусмотрены инструменты для подключения
к ЕСИА, но переносить сайт на новую CMS ради интеграции с порталом госуслуг
нецелесообразно, и, зачастую, попросту невозможно.

Универсальное решение — библиотеки с открытым исходным кодом. С их помощью можно обеспечить
работу с сервисом для любой IT-системы, но для их настройки требуются технические навыки. Мы
предпочитаем использовать Open Source компоненты, однако дорабатываем и адаптируем их для каждого
проекта.

Можно ли подключить к ЕСИА мобильное приложение

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Да, но в приложение должен быть интегрирован браузер. Он необходим только для авторизации,
так что все остальные операции с приложением можно реализовать через обычный интерфейс. Например,
так функционируют приложения «Госуслуги» и «Почта России».

Сколько времени уходит на подключение к ЕСИА

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

На работы по настройке коннектора для базового подключения требуется две — три недели.
В случаях, когда необходимо получение данных из аккаунта ЕСИА и дальнейшая их обработка,
срок увеличивается.

Сколько стоит подключение

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

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

Как организации подключиться к ЕСИА

Процедура подключения занимает около месяца. Это время включает регистрацию необходимых аккаунтов, получение данных от Минцифры, работы по интеграции ИС.

1. Зарегистрируйте руководителя организации на Портале госуслуг. Регистрировать компании в ЕСИА могут только те их представители, которые вправе действовать без доверенности. Им понадобится подтверждённая учётная запись физического лица – т.е. нужно будет не только указать свои данные, но и обратиться в банк или МФЦ для верификации. В последнее время многие банки позволяют сделать это онлайн, через их приложения.

2. Зарегистрируйте вашу организацию.

a. Получите квалифицированную электронную подпись (КЭП) на руководителя организации.

b. Зарегистрируйте юридическое лицо в профиле ЕСИА.

c. Оформите КЭП для юридического лица.

Оформлением КЭП занимаются аккредитованные удостоверяющие центры. Подробная инструкция по этому процессу здесь.

3. Зарегистрируйте информационную систему в ЕСИА.

Регистрация системы происходит через технологический портал. Доступ к нему может получить один из сотрудников компании – действовать через аккаунт представителя уже не обязательно. Этот процесс подробно расписан в Руководстве пользователя технологического портала ЕСИА. В результате регистрации информационная система заносится в реестр ИС и получает мнемонический буквенно-цифровой код.

4. Доработайте систему для обмена данными с ЕСИА.

Аутентификация пользователей в ЕСИА происходит по OAuth 2.0 и OpenID Connect 1.0. Компании необходимо сгенерировать закрытый ключ и сертификат открытого ключа, зарегистрировать его на технологическом портале. Стоит отметить, что ЕСИА поддерживает только российские алгоритмы шифрования ГОСТ Р 34.10-2012 и ГОСТ Р 34.11-2012.

Стоит отдельно отметить, что если в компании уже используются средства верификации пользователей посредством Single Sign-On, то особых технических трудностей при подключении к ЕСИА не будет.

5. Подключитесь к тестовой среде ЕСИА

6. Подключитесь к промышленной среде ЕСИА

Чем отличается Госуслуги от ЕСИА?

Система ЕСИА часто ассоциируется с порталом Госуслуги, но технически это не одно и то же. Однако регистрация в ЕСИА — это, по сути, регистрация на Госуслугах, поэтому учётная запись на портале идентична учётной записи в ЕСИА и содержит одинаковые персональные данные пользователя.

Как зарегистрироваться в ЕСИА через Госуслуги?

  • Войдите в личный кабинет. Нажмите на имя или фото.
  • По инструкции подключите электронную подпись
  • После проверки подписи заполните анкету со сведениями об организации и руководителе и нажмите «Продолжить»
  • После этого страницу можно закрыть.

Реализуем

Устанавливаем сертификаты

Такс~ Всё готово. Качаем сертификаты по ссылке из методички. Специально не буду вставлять, так как может измениться.

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Здесь нам интересен сертификат ТЕСИА ГОСТ 2012.cer – это сертификат с помощью которого ЕСИА подписывает сообщения отправляя в нашу ИС. (Соответственно для продуктовой среды свой сертификат). Устанавливаем сертификат как доверенный. Здесь ничего сложного думаю разберётесь.

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Теперь устанавливаем тестовый контейнер и сертификат. Для примера будем использовать предоставленные ЕСИА контейнеры, но вы можете использовать свои. Всё это лежит внутри архива.

Сам архив со всеми тестовыми контейнерами
Сам архив со всеми тестовыми контейнерами
Мы возьмём именно 006 так как на него зарегистрирована наша ИС
Мы возьмём именно 006 так как на него зарегистрирована наша ИС
Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Теперь открываем КриптоПРО CSP. Выбираем установить личный сертификат и указываем Тестовое ведомство Фамилия006 ИО.cer и нажимаем найти автоматически. Выполняем оставшиеся шаги сами.

Где взять ЕСИА?

Для регистрации упрощенной учетной записи ЕСИА необходимо перейти на Единый портал gosuslugi.ru.Эта страница включает в себя:

  • ФИО;
  • пол;
  • дата рождения;
  • место рождения;
  • гражданство;
  • вид документа, удостоверяющего личность;
  • данные документа, удостоверяющего личность;
  • СНИЛС.

Для чего ЕСИА коммерческим компаниям

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

Что значит не подтверждена учётная запись в ЕСИА?

Зарегистрировавшись и указав персональные данные, вы получите учетную запись уровня «Неподтвержденная». Она дает ограниченные возможности: доступ к информационным госуслугам и сервисам (например, запись к врачу или проверка статуса заявления), просмотр задолженностей и штрафов.

Кто является оператором ЕСИА?

ОГРН Основной государственный регистрационный номер. Оператор ЕСИА Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации.

Какие данные можно получать из ЕСИА

Для организаций, зарегистрированных в ЕСИА, этот список составляют типовые реквизиты: наименование,
юридический адрес, ОГРН, код ОКПО и т.д. Кроме того, при создании учетной записи присваивается один
из трех статусов, отражающих ее надежность.

Государственные органы, с разрешения владельца учетной записи, могут получить всю информацию
из аккаунта, но для коммерческих организаций доступ ограничен. Им доступны данные
о подтвержденности аккаунта, ФИО пользователей и часть паспортных данных.

Больше проверок:  Ежегодные сводные планы проведения проверок предприятий на 2023 год

Какие бывают учетные записи в ЕСИА

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Каждый новый пользователь сервиса первоначально получает «упрощенную» учетную запись с ограниченными
возможностями. Когда пользователь указывает правильные паспортные данные или СНИЛС, аккаунт проходит проверку
со стороны государственных органов, и учетной записи присваивается статус — «стандартная». Для получения
«подтвержденного» аккаунта его владелец должен пройти идентификацию при помощи авторизованного интернет-банка
 или лично посетив МФЦ.

История созданияПравить

2013 — Постановлением Правительства Российской Федерации от 25 января 2013 года № 33 «Об использовании простой электронной подписи при оказании государственных и муниципальных услуг» предусмотрено создание в ЕСИА регистра органов и организаций, имеющих право создания (замены) и выдачи ключа простой электронной подписи в целях оказания государственных и муниципальных услуг. Однако информация о сроках исполнения данного постановления и появлении соответствующих функциональных возможностей в ЕСИА отсутствует.

Сколько пользователей в ЕСИА

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

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Согласно отчету Ростелеком, сервисом пользуется
больше 80 миллионов человек — каждый второй житель России.

Как войти в ЕСИА?

  • Для подключения сервиса потребуется учетная запись физлица — ее можно получить и подтвердить через онлайн-банк.
  • Вам нужна квалифицированная электронная подпись.
  • Это делается так: заходите под учетной записью руководителя на Госуслуги, заполняете форму и дожидаетесь окончания проверки.

Как зарегистрировать организацию в ЕСИА

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

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Затем администратор оформляет квалифицированную
электронную подпись
и вносит новую IT-систему в особый регистр. Эта процедура подробно
изложена в детальном руководстве.

После регистрации IT-системе присваивается мнемоника — индивидуальный код-идентификатор. Он потребуется
техническим специалистам для дальнейшей настройки системы.

СсылкиПравить



Сколько стоит ЕСИА?

Сколько стоит? Стоимость работ по интеграции с ЕСИА «под ключ» от 130 000 руб. В данную сумму входит стоимость модуля интеграции с ЕСИА, работы по интеграции модуля в информационную систему, функционал по созданию пользователей и заполнению полей профиля на основе полученных из ЕСИА данных.

Кто может подключиться к ЕСИА?

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

Ответы на частые вопросы о подключении организации к ЕСИА

Официальные инструкции запутанны и сложны для восприятия, так что мы подготовили FAQ по теме
интеграции с ЕСИА на основе вопросов, которые чаще всего задают наши клиенты.

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Приступаем

Кабинет тестовой среды - Технологический порталйт
Кабинет тестовой среды – Технологический порталйт

Здесь ищем нашу систему по Мнемонике или полному названию, если таковой нет то создаём. Напротив нашей системы есть две кнопки:
Первая кнопка – изменить нашу ИС (информация о ИС, редиректы и тд)
Вторая кнопка – наши сертификаты с помощью которых мы подписываем сообщения в ЕСИА

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Настройка ИС

Есть важный момент в настройки ИС. Это URL системы. Тут мы указываем ссылки куда ЕСИА может делать переадресацию при запросе от нашей ИС. На эти точки будет приходить авторизационный код (Если он указан в запросе).

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Сертификаты ИС

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Здесь мы можем загрузить наш сертификаты или же удалить их. Есть один важный момент, каждая ИС может иметь только один уникальный сертификат. А связи с тем, что на тестовой среде все системы регистрируются под одним пользователем и сертификаты тестовые одни на всех часта такая ситуация, что кто-то удаляет у вас сертификат и загружает к себе. А ваши запросы теперь падают с ошибкой) Но если у вас уже готов ЭЦП на сотудника, то лучше используйте её.

Предупреждает ли Минкомсвязи о регламентных работах

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

Отключения ЕСИА редки и, как правило, происходят в часы наименьшей нагрузки на сервис,
а восстановление работы авторизации происходит автоматически.

Всё необходимое

Наш инвентарь для путешествия:

  • Контейнер закрытого ключа с сертификатом нашей организации

Немного о КриптоПРО CSP + .Net Core 5+

Вот тут и начинаются первые проблемы. На момент написания статьи у КриптоПРО .Net нет поддержки .Net Core 5 и выше. Есть сборка под .Net Core 3.1 но и она выглядит сомнительно. Поэтому было решено поднять сервис для .Net Framework 4.8 который будет использовать средства КриптоПРО CSP для подписания с использованием <abbr title="Электронная цифровая подпись" data-title="

Электронная цифровая подпись

” data-abbr=”ЭЦП”>ЭЦП, а так же проверки ответов от ЕСИА.

Немного о контейнере закрытого ключа и сертификата

Когда мы начинали делать эту задачу у нас была <abbr title="Квалифицированная электронная подпись" data-title="

Квалифицированная электронная подпись

” data-abbr=”КЭП”>КЭП на токене, но как оказалось на нём был неэкспортируемый контейнер. Скажу сразу, что экспортировать контейнер с такого токена запрещено ФНС. Поэтому необходимо заранее получить токен на имя сотрудника с экспортируемым контейнером. Так как его необходимо будет скопировать на сервер.

Какие возможности открывает такая идентификация

1. Клиент может подписывать юридически значимые электронные документы, получать защищённый доступ к конфиденциальной информации, медицинским данным и т.д.

2. Появляется возможность автоматически заполнять в анкетах и заявках персональные данные клиента: ФИО, данные паспорта, ИНН, информация о детях и др. При этом компания может быть уверена, что эти данные абсолютно верны и правдивы.

3. Страховые компании и банки могут продавать через приложение свои продукты. И никаких расходов, которые связаны с традиционными, оффлайновыми каналами продаж – не нужно собирать документы, приглашать человека в офис, достаточно разработать скрипт для колл-центра.

4. Для пользователя верификация с ЕСИА повышает доверие к сервису и делает саму процедуру удобнее – не нужно помнить дополнительные пароли, просто нажимаешь знакомую кнопку и всё.

В наших проектах интеграция ЕСИА активно используется в продуктах страховых компаний. Это позволяет клиентам покупать полисы ОСАГО, отправлять извещения о ДТП при оформлении заявок на урегулирование убытков. Это критически важная функция для сценариев заявления о страховых случаях по ОСАГО, когда пользователь не является клиентом данной страховой компании.

Хотя сейчас к ЕСИА могут подключиться не все организации, можно ожидать, что такая авторизация скоро станет де-факто стандартом для пользовательских сервисов. Просто потому, что это надёжно и удобно для клиентов – вместо отдельной учётной записи для каждого ресурса можно использовать единый аккаунт «Госуслуг» и бесшовно пользоваться любыми нужными услугами. Поэтому задумываться об интеграции стоит всем компаниям.

Кто может использовать ЕСИА?

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

ТакжеПравить

Что такое ЕСИА

Министерство цифрового развития, связи и массовых коммуникаций уже больше десяти лет разрабатывает
и совершенствует безопасный сервис авторизации для различных государственных сервисов и сайтов. Он получил
название «Единая система идентификации и аутентификации» — ЕСИА. Это универсальный ключ доступа к ресурсам
электронного правительства РФ.

Больше проверок:  Проверки, запланированные на 2023 год, коснутся только компаний с высоким риском

Если вначале ЕСИА применялась для авторизации на портале Госуслуг, то по мере выполнения Федерального
проекта «Цифровое государственное управление» и появления
новых суперсервисов, ее сфера применения
расширилась.

ЕСИА применяется для взаимодействия с органами власти и за пределами государственного сектора.
К сервису подключаются порталы и IT-системы частных компаний из числа тех, для которых точная
и безошибочная идентификация пользователей — приоритет.

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

Как работает ЕСИА

С точки зрения пользователя вход на сайт или в мобильное приложение при помощи ЕСИА
не отличается от использования аккаунта Google, Яндекс или одной из популярных социальных сетей.

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

В момент ввода данных сайт обращается к отдельному программному модулю — коннектору, отвечающему
за связь с ЕСИА. Коннектор формирует зашифрованный запрос к серверам сервиса и получает
в ответ пакет с личными данными пользователя. Они расшифровываются при помощи криптографического
ключа, выданного организации заранее, еще на этапе настройки коннектора. Затем, личные данные передаются
на сайт.

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

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

  1. Пользователь заходит на сайт банка, чтобы оформить кредит.
  2. Выбрав нужную сумму в кредитном калькуляторе, он переходит к оформлению заявки.
  3. Вместо того чтобы заполнять длинную анкету с личными данными, пользователь кликает на кнопку
    авторизации в ЕСИА.
  4. Модуль-коннектор переходит на сайт ЕСИА и открывает форму авторизации.
  5. Пользователь вводит телефон, email или СНИЛС и пароль и подтверждает передачу персональных данных.
  6. Система проверяет корректность данных и возвращает пользователя на сайт банка, а коннектор
    получает и расшифровывает ответ, содержащий необходимую банку информацию о пользователе.
  7. Анкета, необходимая для создания заявки на кредит, заполняется автоматически.
  8. Пользователю остается подтвердить отправку заявки и ждать звонка менеджера.

Где можно подтвердить ЕСИА?

Подтверждение учетной записи на портале Госуслуги (ЕСИА):

  • Создайте профиль на портале Госуслуги.
  • После проверки документов Ваша учетная запись получит статус «Стандартная».
  • Подтвердите регистрацию в любом офисе Экспобанка, взяв с собой паспорт и СНИЛС

Механизм подписания

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

Для получения авторизационный ссылки – ссылка на которую мы будем переадресовывать пользователя для авторизации в ЕСИА. Нам необходимо собрать ссылку из параметров.

  1. client_id – наша Мнемоника

  2. client_secret – Отсоединённая подпись от параметров запроса в кодировке UTF-8

  3. redirect_uri – ссылка на которую ЕСИА будет переадресовывать пользователя вместе с авторизационным кодом

  4. scope – перечень запрашиваемой информации. Например fullname birthdate gender

  5. response_type – тип ответа от ЕСИА, в нашем случае это просто строчка code

  6. state – Идентификатор текущего запроса. Генерируется таким образом Guid.NewGuid().ToString("D");

  7. timestamp – время запроса авторизационного кода в формате yyyy.MM.dd HH:mm:ss Z. Генерируется таким образом DateTime.UtcNow.ToString("yyyy.MM.dd HH:mm:ss +0000");

  8. client_certificate_hash – это fingerprint сертификата в HEX-формате.

Обозначили наш зоопарк. Самый важный зверь здесь client_secret

Получаем client_certificate_hash

В методическом указании от Минцифр есть ссылка на специальную утилиту с помощью которой мы можем получить этот хэш. Разархивировали архив и видим перед нами sh. Windows пользователи не пугаемся, на самом деле тут же лежит .exe файл. Чтобы вычислить хэш нашего сертификат просто необходимо из cmd запустить вот такой скрипт:

cpverify.exe test.cer -mk -alg GR3411_2012_256 -inverted_halfbytes 0

Формирование client_secret

Такс перед тем как просто получит client_secret нам необходимо сделать:

  • ASP.Net Framework 4.8 WebAPI – тот самый сервис который будет работать с КриптоПРО CSP

Пропустим множество шагов создания этого сервиса и перейдём сразу к его настройки для работы с КриптоПРО CSP.

Настройка сервиса для работы с КриптоПРО CSP

Добавляем ссылки на DLL КриптоПРО.
Переходим по пути C:\Program Files (x86)\Crypto Pro.NET SDK\Assemblies\4.0
Выбираем всё что нам нужно. (подробная информация)

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Теперь мы имеем доступ к API КриптоПРО CSP из кода .Net Framework

Теперь создаём контроллер:

Код контроллера

Итак нам необходимо получать строку для подписания. Создадим метод

const string CertSerialNumber = "01f290e7008caed0904b967783fd0e4ad6";
const string EsiaCertSerialNumber = "0125657e00a1ae59804d92116214e53466";

[HttpGet]
public string Get(string msg)
{
    msg = Base64UrlEncoder.Decode(msg);

    var data = Encoding.UTF8.GetBytes(msg);

    var client_secret = Sign(data);

    return client_secret;
}

Мы заранее укажем константами серийные номера сертификатов.
В методе Get получаем строку в Base64Url формате, чтобы спокойно передавать наши длинные сообщения.
Декодируем строку из Base64Url в текст. После чего переводим текст в байты используя UTF-8. А теперь подписываем.

string Sign(byte[] data)
{
    var gost3411 = new Gost3411_2012_256CryptoServiceProvider();
    var hashValue = gost3411.ComputeHash(data);
    gost3411.Clear();
    var signerCert = GetSignerCert();
    var SignedHashValue = GostSignHash(hashValue,
        signerCert.PrivateKey as Gost3410_2012_256CryptoServiceProvider, "Gost3411_2012_256");
    var client_secret = Base64UrlEncoder.Encode(SignedHashValue);

    return client_secret;
}

И так что мы тут делаем. С помощью ГОСТ 34.11-2012 мы вычисляем хэш нашего сообщения. И используя полученный сертификат подписываем сообщение.

X509Certificate2 GetSignerCert()
{
    var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
    var certificates = store.Certificates.Find(X509FindType.FindBySerialNumber, CertSerialNumber, false);

    if (certificates.Count != 1)
    {
        return null;
    }

    var certificate = certificates[0];

    if (certificate.PrivateKey == null)
    {
        return null;
    }

    return certificate;
}

Здесь мы открываем наш склад с контейнерами и ищем именно тот где лежит наш сертификат. После чего извлекаем из него сертификат.

byte[] GostSignHash(byte[] HashToSign, Gost3410_2012_256CryptoServiceProvider key, string HashAlg)
{
    try
    {
        //Создаем форматтер подписи с закрытым ключом из переданного 
        //функции криптопровайдера.
        var Formatter = new Gost2012_256SignatureFormatter(
            (Gost3410_2012_256CryptoServiceProvider) key);

        //Устанавливаем хэш-алгоритм.
        Formatter.SetHashAlgorithm(HashAlg);

        //Создаем подпись для HashValue и возвращаем ее.
        return Formatter.CreateSignature(HashToSign);
    }
    catch (CryptographicException e)
    {
        Console.WriteLine(e.Message);
        return null;
    }
}

С помощью этого кода как раз и создаётся наша подпись на хэш строки. Здесь используется ГОСТ 34.10-2012.

Итак контроллер готов. Теперь переходим в наш основной проект на .Net Core

Создаём строку подписания. Просто выполняем конкатенацию параметры без разделителей. Здесь я использую IOptions чтобы брать параметры из appsettings.json.

var msg = $"{esiaSettings.Value.ClientId}{esiaSettings.Value.Scope}{timestamp}{state}{redirectUri}";

Мы получил строку для подписания. Теперь нам необходимо эту строку закодировать в Base64Url и отправляем её на подписание в написанный нами заранее сервис

private string GetClientSecret(string msg){
  var client = new HttpClient();

  var msgBase64 = Base64UrlEncoder.Encode(msg);
  
  var response = await client.GetAsync($"{cryptoProSettings.Value.BaseUrl}/Get?msg={msgBase64}");
  
  var clientSecret = await response.Content.ReadAsStringAsync();
  
  clientSecret = JsonConvert.DeserializeObject<string>(clientSecret);
  
  return clientSecret;
}

Собираем ссылку для авторизации в Госуслугах

Наконец-то мы получили этот долгожданный секрет. Но вы могли бы подумать это всё, дальше всё просто и ясно. Не тут то было! Дело в том, что ЕСИА требует Base64 Url Safe кодироку. И она немного отличается от Base64Url кодировки доступной из коробки .Net
Итак дело за малым, собираем нашего гомункула из секрета и параметров.

Класс помощник для сборки ссылки

Возможно излишне, но мне понравился метод сбора вот таким способом.

public class RequestBuilder
{
    List<RequesItemClass> items = new List<RequesItemClass>();
    public void AddParam(string name, string value)
    {
        items.Add(new RequesItemClass { name = name, value = value });
    }
    public override string ToString()
    {
        return string.Join("&", items.Select(a => a.name + "=" + a.value));
    }
}

public class RequesItemClass
{
    public string name;
    public string value;
}
Код сборки ссылки
async Task<string> UrlBuild(string redirectUri)
{
    using var client = new HttpClient();

    var timestamp = DateTime.UtcNow.ToString("yyyy.MM.dd HH:mm:ss +0000");
    var state = Guid.NewGuid().ToString("D");

    var msg = $"{esiaSettings.Value.ClientId}{esiaSettings.Value.Scope}{timestamp}{state}{redirectUri}";

    var clientSecret = await GetClientSecret(msg);

    var builder = new RequestBuilder();
    builder.AddParam("client_secret", clientSecret);
    builder.AddParam("client_id", esiaSettings.Value.ClientId);
    builder.AddParam("scope", esiaSettings.Value.Scope);
    builder.AddParam("timestamp", timestamp);
    builder.AddParam("state", state);
    builder.AddParam("redirect_uri", redirectUri);
    builder.AddParam("client_certificate_hash", esiaSettings.Value.ClientCertificateHash);
    builder.AddParam("response_type", "code");
    builder.AddParam("access_type", "online");

    //Вот тут самый важный момент на который было потрачено множество времени. Просто заменяем символы на безопасные
    var url = esiaSettings.Value.EsiaAuthUrl + "?" + builder.ToString().Replace("+", "%2B")
        .Replace(":", "%3A")
        .Replace(" ", "+");

    return url;
}

Получаем ссылку на подобии вот такой:
Здесь https://esia-portal1.test.gosuslugi.ru/aas/oauth2/v2/ac ссылка на конечную точку получения авторизационно кода, указана в методическом материале.

https://esia-portal1.test.gosuslugi.ru/aas/oauth2/v2/ac?client_secret=v_c33_-LpkyKJbopTEYqBMbGZrBy9r9u1pzbRmMLNlJPcBnPTJj6Xx5DuxXba3EZZoXdMsb0YIwPDCoF0dfYjQ&client_id=MEMONIKA&scope=fullname+birthdate+gender&timestamp=2022.12.23+16%3A37%3A45+%2B0000&state=3a19c4d7-594b-496f-aa6e-970c75a925a4&redirect_uri=https%3A//api.site/users/esia&client_certificate_hash=EED1079A4FF154E117EAA196DCB551930807825DE1DE15EAF7607F354BA47423&response_type=code&access_type=online

Теперь перенаправляем пользователя по этой ссылке и ожидаем пока он авторизуется. После авторизации ЕСИА переадресует его на нашу ссылку и отправит туда в виде аргументов авторизационный код и state.

Получение токена доступа

Теперь время получить токен взамен на авторизационный код.

Метод для получение токена
public async Task<EsiaAuthToken> GetToken(string authorizationCode, string redirectUrl)
{
    var timestamp = DateTime.UtcNow.ToString("yyyy.MM.dd HH:mm:ss +0000");
    var state = Guid.NewGuid().ToString("D");

    var msg =
        $"{esiaSettings.Value.ClientId}{esiaSettings.Value.Scope}{timestamp}{state}{redirectUrl}{authorizationCode}";

    var clientSecret = await GetClientSecret(msg);

    var requestParams = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("client_id", esiaSettings.Value.ClientId),
        new KeyValuePair<string, string>("code", authorizationCode), //Здесь мы передаём полученный код
        new KeyValuePair<string, string>("grant_type", "authorization_code"),  //Просто указываем тип
        new KeyValuePair<string, string>("state", state),
        new KeyValuePair<string, string>("scope", esiaSettings.Value.Scope),
        new KeyValuePair<string, string>("timestamp", timestamp),
        new KeyValuePair<string, string>("token_type", "Bearer"),  //Какой токен мы хотим получить
        new KeyValuePair<string, string>("client_secret", clientSecret),
        new KeyValuePair<string, string>("redirect_uri", redirectUrl),
        new KeyValuePair<string, string>("client_certificate_hash", esiaSettings.Value.ClientCertificateHash)
    };

    using var client = new HttpClient();
    using var response = await client.PostAsync(esiaSettings.Value.EsiaTokenUrl,
        new FormUrlEncodedContent(requestParams));
    response.EnsureSuccessStatusCode();
    var tokenResponse = await response.Content.ReadAsStringAsync();

    var token = JsonConvert.DeserializeObject<EsiaAuthToken>(tokenResponse);

    if (!await ValidatingAccessToken(token))
    {
        throw new Exception("Ошибка проверки маркера индентификации");
    }

    return token;
}

Тут всё простенько, снова генерируем client_secret указываем остальные параметры и отправляем запрос в ЕСИА на получение токена. Тестовый Uri https://esia-portal1.test.gosuslugi.ru/aas/oauth2/v3/te

Класс токена
public class EsiaAuthToken
{
    /// <summary>
    /// Токен доступа
    /// </summary>
    [JsonProperty("access_token")]
    public string AccessToken { get; set; }

    /// <summary>
    /// Идентификатор запроса
    /// </summary>
    public string State { get; set; }

    string[] parts => AccessToken.Split('.');

    /// <summary>
    /// Хранилище данных в токене
    /// </summary>
    public EsiaAuthTokenPayload Payload
    {
        get
        {
            if (string.IsNullOrEmpty(AccessToken))
            {
                return null;
            }

            if (parts.Length < 2)
            {
                throw new Exception($"При расшифровке токена доступа произошла ошибка. Токен: {AccessToken}");
            }

            var payload = Encoding.UTF8.GetString(Base64UrlEncoder.DecodeBytes(parts[1]));
            return JsonConvert.DeserializeObject<EsiaAuthTokenPayload>(payload);
        }
    }

    /// <summary>
    /// Сообщение для проверки подписи
    /// </summary>
    [Newtonsoft.Json.JsonIgnore]
    public string Message
    {
        get
        {
            if (string.IsNullOrEmpty(AccessToken))
            {
                return null;
            }

            if (parts.Length < 2)
            {
                throw new Exception($"При расшифровке токена доступа произошла ошибка. Токен: {AccessToken}");
            }

            return parts[0] + "." + parts[1];
        }
    }

    /// <summary>
    /// Сигнатура подписи
    /// </summary>
    [Newtonsoft.Json.JsonIgnore]
    public string Signature
    {
        get
        {
            if (string.IsNullOrEmpty(AccessToken))
            {
                return null;
            }

            if (parts.Length < 2)
            {
                throw new Exception($"При расшифровке токена доступа произошла ошибка. Токен: {AccessToken}");
            }

            return parts[2];
        }
    }

    public class EsiaAuthTokenPayload
    {
        [JsonConstructor]
        public EsiaAuthTokenPayload(string tokenId, string userId, string nbf, string exp, string iat, string iss,
            string client_id)
        {
            TokenId = tokenId;
            UserId = userId;
            BeginDate = EsiaHelper.DateFromUnixSeconds(double.Parse(nbf));
            ExpireDate = EsiaHelper.DateFromUnixSeconds(double.Parse(exp));
            CreateDate = EsiaHelper.DateFromUnixSeconds(double.Parse(iat));
            Iss = iss;
            ClientId = client_id;
        }

        /// <summary>
        /// Идентификатор токена
        /// </summary>
        [JsonProperty("urn:esia:sid")]
        public string TokenId { get; private set; }

        /// <summary>
        /// Идентификатор пользователя
        /// </summary>
        [JsonProperty("urn:esia:sbj_id")]
        public string UserId { get; private set; }

        /// <summary>
        /// Время начала действия токена
        /// </summary>
        [JsonPropertyName("nbf")]
        public DateTime BeginDate { get; private set; }

        /// <summary>
        /// Время окончания действия токена
        /// </summary>
        [JsonPropertyName("exp")]
        public DateTime ExpireDate { get; private set; }

        /// <summary>
        /// Время выпуска токена
        /// </summary>
        [JsonPropertyName("iat")]
        public DateTime CreateDate { get; private set; }

        /// <summary>
        /// Организация, выпустившая маркер
        /// </summary>
        [JsonPropertyName("iss")]
        public string Iss { get; private set; }

        /// <summary>
        /// Адресат маркера
        /// </summary>
        [JsonPropertyName("client_id")]
        public string ClientId { get; private set; }
    }
  }

  public static class EsiaHelper
  {
      public static DateTime DateFromUnixSeconds(double seconds)
      {
          var date = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);

          return date.AddSeconds(seconds).ToLocalTime();
      }
  }

Проверка токена

Итак помимо того, что нам нужно получить токен, нам так же необходимо проверить его.

Больше проверок:  Комплексное руководство по проверке и анализу ключей открытия магазинов

Сам токен состоит из 3 частей.
1 часть – заголовок JWT токена
2 часть – payload токена, там вся основная информация о токене
3 часть – RAW подпись в формате UTF-8

Код конечной точки для проверки подписи
[HttpPost]
public bool Verify(VerifyMessage message)
{
    try
    {
        return VerifyRawSignString(message.Message, message.Signature);
    }
    catch (Exception ex)
    {
        return false;
    }
}

public class VerifyMessage
{
    public string Signature { get; set; }
    public string Message { get; set; }
}
Код проверки подписи на нашем сервисе
/// <summary>
/// Проверка подписи JWT в формате HEADER.PAYLOAD.SIGNATURE.
/// </summary>
/// <param name="message">HEADER.PAYLOAD в формате Base64url</param>
/// <param name="signature">SIGNATURE в формате Base64url</param>
bool VerifyRawSignString(string message, string signature)
{
    var signerCert = GetEsiaSignerCert();

    var messageBytes = Encoding.UTF8.GetBytes(message);
    var signatureBytes = Base64UrlEncoder.DecodeBytes(signature);
    //Переварачиваем байты, так как используется RAW подпись
    Array.Reverse(signatureBytes, 0, signatureBytes.Length);

    using (var GostHash = new Gost3411_2012_256CryptoServiceProvider())
    {
        var csp = (Gost3410_2012_256CryptoServiceProvider) signerCert.PublicKey.Key;
        //Используем публичный ключ сертификата для проверки  
        return csp.VerifyData(messageBytes, GostHash, signatureBytes);
    }
}
Код получения сертификата ЕСИА
X509Certificate2 GetEsiaSignerCert()
{
    var store = new X509Store(StoreName.AddressBook, StoreLocation.CurrentUser);
    store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
    var certificates = store.Certificates.Find(X509FindType.FindBySerialNumber, EsiaCertSerialNumber, false);

    var certificate = certificates[0];

    return certificate;
}

Здесь используем введённые ранее константы. И Получаем сертификат из доверенных сертификатов.

Отправка токена на проверку
public async Task<bool> ValidatingAccessToken(EsiaAuthToken token)
{
    if (token.Payload.ExpireDate <= DateTime.Now ||
        token.Payload.BeginDate >= DateTime.Now ||
        token.Payload.CreateDate >= DateTime.Now ||
        token.Payload.ExpireDate <= token.Payload.BeginDate ||
        token.Payload.CreateDate > token.Payload.BeginDate ||
        token.Payload.CreateDate > token.Payload.ExpireDate ||
        token.Payload.Iss != esiaSettings.Value.ISS ||
        token.Payload.ClientId != esiaSettings.Value.ClientId)
    {
        return false;
    }

    var client = new HttpClient();

    var requestParams = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("signature", token.Signature),
        new KeyValuePair<string, string>("message", token.Message)
    };

    var response = await client.PostAsync($"{cryptoProSettings.Value.BaseUrl}/Verify",
        new FormUrlEncodedContent(requestParams));

    response.EnsureSuccessStatusCode();
    var resultResponse = await response.Content.ReadAsStringAsync();

    var result = JsonConvert.DeserializeObject<bool>(resultResponse);

    return result;
}

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

Получение данных пользователя из ЕСИА

public async Task<EsiaUser> ExecuteAsync(string esiaUserId, string accessToken)
{
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Clear();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        var response = await client.GetStringAsync($"{esiaSettings.Value.EsiaRestUrl}/prns/{esiaUserId}");
        var user = JsonConvert.DeserializeObject<EsiaUser>(response);
        user.Id = user.Id ?? esiaUserId;

        return user;
    }
}
Код класса EsiaUser
public class EsiaUser
{
    /// <summary>
    /// Идентификатор
    /// </summary>
    [JsonProperty("oid")]
    public string Id { get; set; }

    /// <summary>
    /// Фамилия
    /// </summary>
    [JsonProperty("firstName")]
    public string FirstName { get; set; }

    /// <summary>
    /// Имя
    /// </summary>
    [JsonProperty("lastName")]
    public string LastName { get; set; }

    /// <summary>
    /// Отчество
    /// </summary>
    [JsonProperty("middleName")]
    public string MiddleName { get; set; }

    /// <summary>
    /// Дата рождения
    /// </summary>
    [JsonProperty("birthdate")]
    public string Birthdate { get; set; }

    /// <summary>
    /// Пол
    /// </summary>
    [JsonProperty("gender")]
    public string Gender { get; set; }

    /// <summary>
    /// Подтвержден ли пользователь
    /// </summary>
    [JsonProperty("trusted")]
    public bool Trusted { get; set; }
}

Предисловие

Передо мной стояла задача по интеграции нашего сервиса с госуслугами. Казалось ничего сложного не предстоит, но учитывая что наш сервис базируется на технологии ASP.NET всё было не так оптимистично. В начале были поиски.. много поисков, которые привели к множеству разрозненной и чаще всего неактуальной информации. Так же были найдены уже готовые решения, но как заявляли некоторые товарищи на форумах за такое могут и по головке погладить. Поэтому было решено писать самому.

Эта статья скорее больше актуализация и дополнение информации из этой статьи.

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

Как информационная система работает с ЕСИА

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

Технически процесс выглядит так:

1. Пользователь обращается к защищённому ресурсу информационной системы (например, при онлайн-покупке полиса ОСАГО).

2. Информационная система направляет в ЕСИА запрос на аутентификацию.

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

5. На основании этой информации система открывает пользователю доступ.

Где можно найти дополнительную информацию о ЕСИА

Как расшифровать esia и как подключить свой сайт к "Госуслугам" и зачем это вообще делать

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

Общую информацию о подключении к ЕСИА, а также контакты для связи с Ситуационным
центром Минкомсвязи, где можно получить консультацию по правовым аспектам подключения, приведены на информационной странице ЕСИА
на портале Госуслуг.

Актуальные документы, касающиеся сервиса, публикуются на официальном портале Минкомсвязи РФ. Перечень
документов, которые публикует министерство, включает в себя:

Как работает ЕСИА?

Как работает ЕСИА