Без авторизации есиа

Без авторизации есиа pos gosuslugi
Содержание
  1. Где можно найти дополнительную информацию о ЕСИА
  2. FAQ по подключению организации к ЕСИА
  3. Распространенные ошибки при регистрации
  4. Что делать если не подписывает цифровая подпись
  5. Как зарегистрироваться в личном кабинете Госуслуги?
  6. Восстановление пароля
  7. Прохождение проверки при входе через ЕСИА
  8. Получение данных организации
  9. Как организации подключиться к ЕСИА
  10. Ответы на частые вопросы о подключении организации к ЕСИА
  11. Как зарегистрироваться в единой информационной системе в сфере закупок и аккредитоваться на ЭТП
  12. Отсутствует Информация о Пользователе Есиа Сбербанк Аст Что Делать • Что нужно для регистрации
  13. Где можно найти дополнительную информацию о ЕСИА
  14. Для чего ЕСИА коммерческим компаниям
  15. Получение данных пользователя
  16. Кто может подключиться к ЕСИА
  17. Для чего ЕСИА коммерческим компаниям
  18. Как подключить сайт организации или другую IT-систему к ЕСИА
  19. Какой протокол использовать для подключения к ЕСИА и чем он отличается от стандартов
  20. Какой сертификат нужен для регистрации системы в ЕСИА и обязательно ли использовать ГОСТ-криптографию?
  21. Какие готовые решения можно использовать для подключения
  22. Можно ли подключить к ЕСИА мобильное приложение
  23. Сколько времени уходит на подключение к ЕСИА
  24. Сколько стоит подключение
  25. Ошибка есиа ошибка входа доступ к личному кабинету недропользователя отсутствует
  26. Предисловие
  27. Как зарегистрировать организацию в ЕСИА
  28. Что делать и как?
  29. Перенаправление в ЕСИА и аутентификация
  30. Учётная запись ЕСИА
  31. Валидация токена
  32. Получение данных пользователя из ЕСИА
  33. Получение токена доступа
  34. Что такое ЕСИА
  35. Как работает ЕСИА
  36. Что теперь делать со всеми этими данными?
  37. Инструкция по формированию заявки электронного аукциона на ЭТП Сбербанк-АСТ
  38. Преимущества подтвержденного аккаунта
  39. Получение URL для переадресации
  40. Какие данные можно получать из ЕСИА
  41. Какие бывают учетные записи в ЕСИА
  42. Сколько пользователей в ЕСИА
  43. Получение токена
  44. Зачем нам нужна интеграция с ЕСИА?
  45. Базовая информация
  46. Предупреждает ли Минкомсвязи о регламентных работах
  47. Как войти на сайт через ЕСИА?

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

Без авторизации есиа

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

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

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

FAQ по подключению организации к ЕСИА

  1. Создания физическими лицами, ИП или юридическими лицами единой учётной записи, которая даёт доступ к различным информационным системам, сайтам и порталам, использующим такой способ регистрации, авторизации и (или) идентификации пользователя.
  2. Взаимодействия различных информационных систем на уровне средств подтверждения личности пользователя (идентификации), проверки его данных (аутентификации) и предоставления разрешения на доступ (авторизации).
  3. Авторизации пользователей на государственных, региональных и муниципальных ресурсах для получения соответствующих услуг в электронном виде. Например, для запроса и получения информации, справок, оформления документов, совершения регистрационных действий, записи на приём в то или иное ведомство.
  4. Авторизации пользователей на негосударственных ресурсах (сайтах, порталах, системах), которые подключены к ЕСИА и используют учётные записи в этой системе (с согласия их владельцев) для разрешения доступа.

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

Распространенные ошибки при регистрации

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

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

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

Без авторизации есиа

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

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

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

Без авторизации есиа

Как зарегистрироваться в личном кабинете Госуслуги?

Восстановление пароля

Восстановить пароль от учетной записи довольно просто. Для этого под формой ввода данных от аккаунта кликаем на гиперссылку “Не знаю пароль” и система предложит способы восстановления его через мобильный, путем ввода паспортных данных, номера СНИЛС или ИНН.

Без авторизации есиа

После внесения нужной информации на зарегистрированный в системе мобильный будет отправлен пароль для единоразового входа. Затем его нужно будет сменить в настройках. Процедура восстановления доступа может занять не более 15 минут.

Прохождение проверки при входе через ЕСИА

Если у вас подтвержденная учетная запись, никаких дополнительных проверок проходить не нужно. Всё, что вы должны сделать при авторизации – указать код, который поступит в СМС. Он нужен для проверки того, что доступ к сайту запрашивает именно его владелец.

Иногда проверка личных данных заканчивается безрезультатно. Распространенная причина этого явления – ошибки в написании или недостоверность сведений. Убедитесь, что они верны, если есть ошибки – исправьте их.

Получение данных организации

Полученный токен доступа для запроса данных по организации мы использовать не можем, т.к. он завязан на определенный scope. Поэтому нужно получить отдельный токен. По сути методы получения токена доступа для организации и информации по ней не сильно отличаются от рассмотренных ранее. Для получения токена доступа мы используем идентификатор организации, код аутентификации, State предыдущего запроса на токен доступа. Новый scope формируется как список scope’ов организации, разделенных через пробел, например:

http://esia.gosuslugi.ru/org_shortname/?org_oid={organizationId} http://esia.gosuslugi.ru/ org_fullname/?org_oid={organizationId}

/// <summary>
/// Получить токен для доступа к организациям пользователя
/// </summary>
/// <param name="organizationId">Идентификатор организации</param>
/// <param name="code">Код доступа</param>
/// <param name="state">Идентификатор запроса</param>
/// <param name="callbackUrl">Коллбек адрес для редиректа после авторизации</param>
/// <param name="certificate">Сертификат для подписи запросов</param>
/// <returns>Токен для доступа к организациям пользователя</returns>
public async Task<EsiaAuthToken> GetOrganizationAccessToken(
	string organizationId,
	string code,
	string state,
	string callbackUrl = null,
	X509Certificate2 certificate = null)
{
	var timestamp = DateTime.UtcNow.ToString("yyyy.MM.dd HH:mm:ss +0000");
	var scope = string.Join(" ", Configuration.OrganizationScope.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
		.Select(orgScope => $"{Configuration.EsiaBaseUrl}/{orgScope}?org_oid={organizationId}"));

	// Create signature in PKCS#7 detached signature UTF-8
	var clientSecret = GetClientSecret(
		certificate,
		scope,
		timestamp,
		Configuration.ClientId,
		state);

	var requestParams = new List<KeyValuePair<string, string>>
	{
		new KeyValuePair<string, string>("client_id", Configuration.ClientId),
		new KeyValuePair<string, string>("code", code),
		new KeyValuePair<string, string>("grant_type", "client_credentials"),
		new KeyValuePair<string, string>("state", state),
		new KeyValuePair<string, string>("scope", 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", callbackUrl)
	};
	using (var client = new HttpClient())
	using (var response = await client.PostAsync(Configuration.EsiaTokenUrl, new FormUrlEncodedContent(requestParams)))
	{
		response.EnsureSuccessStatusCode();
		var tokenResponse = await response.Content.ReadAsStringAsync();

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

		Argument.NotNull(token?.AccessToken, "Не найден токен доступа");
		Argument.Require(state == token.State, "Идентификатор запроса некорректный");

		return token;
	}
}

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

/// <summary>
/// Получить данные организации
/// </summary>
/// <param name="organizationLink">Ссылка на организацию</param>
/// <param name="accessToken">Токен доступа</param>
/// <returns>Данные организации</returns>
public async Task<EsiaOrganization> GetOrganization(string organizationLink, string accessToken)
{
	using (var client = new HttpClient())
	{
		client.DefaultRequestHeaders.Clear();
		client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

		var response = await client.GetStringAsync(organizationLink);
		var organization = JsonConvert.DeserializeObject<EsiaOrganization>(response);
		return organization;
	}
}

Полностью же код получения пользователя и его организации из ЕСИА выглядит так:

// Получим токен доступа по коду доступа
var accessToken = await IntegrationService.GetAccessToken(request.Code, request.CallbackUrl);

// Получим информацию о пользователе из ЕСИА
var user = await IntegrationService.GetUser(accessToken.Payload.UserId, accessToken.AccessToken);

// Если у пользователя есть организации - полезем в ЕСИА за ними
if (user.OrganizationLinks?.Links?.Any() == true)
{
	// Новый токен доступа - чисто для организаций
	var link = user.OrganizationLinks.Links.First();
	var organizationId = link.Split('/').Last();
	var organizationAccessToken = await IntegrationService.GetOrganizationAccessToken(organizationId, request.Code, accessToken.State, request.CallbackUrl);

	user.Organization = await IntegrationService.GetOrganization(link, organizationAccessToken.AccessToken);
}

return user;

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

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

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

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

Чтобы получить электронную подпись, оставьте заявку. Наши специалисты помогут вам оформить электронную подпись для физических и юридических лиц — удалённо, быстро и по выгодной цене.

Без авторизации есиа

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

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

Без авторизации есиа

Как зарегистрироваться в единой информационной системе в сфере закупок и аккредитоваться на ЭТП

ЕИС — так сокращенно называется Единая информационная система в сфере госзакупок. Это портал с информацией обо всех государственных тендерах, которые не содержат гостайну.

Отсутствует Информация о Пользователе Есиа Сбербанк Аст Что Делать • Что нужно для регистрации

Без авторизации есиа

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

Без авторизации есиа

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

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

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

Читайте также:  Учащимся и родителям. Участие в олимпиаде

Без авторизации есиа

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

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

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

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

Function<String, String> esiaPersonDataFetcher = (fetchingUri) -> {
  try {
    URI getDataUri = new URIBuilder(fetchingUri).build();
    HttpGet dataHttpGet = new HttpGet(getDataUri);
       dataHttpGet.addHeader("Authorization", requestDto.getTokenType() + " " + tokenResponseDto.getAccessToken());
    try (CloseableHttpResponse dataResponse = httpClient.execute(dataHttpGet)) {
      HttpEntity dataEntity = dataResponse.getEntity();
      return EntityUtils.toString(dataEntity);
    }
  } catch (Exception e) {
    throw new UndeclaredThrowableException(e);
  }
};

Получение данных пользователя:

String personDataEntityString = esiaPersonDataFetcher.apply(ESIA_REST_API_URL + "/prns/" + esiaAccountId);

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

String contactsListEntityString = esiaPersonDataFetcher.apply(ESIA_REST_API_URL + "/prns/" + esiaAccountId + "/ctts");
EsiaListDto esiaListDto = objectMapper.readValue(contactsListEntityString, EsiaListDto.class);

Десериализуем этот список и получим объект esiaListDto. Поля из методички ЕСИА могут различаться, поэтому стоит проверить опытным путем.

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

for (String contactUrl : esiaListDto.getElementUrls()) {
  String contactEntityString = esiaPersonDataFetcher.apply(contactUrl);
  EsiaContactDto esiaContactDto = objectMapper.readValue(contactEntityString, EsiaContactDto.class);
}

С получением списка документов та же ситуация. Вначале получаем список ссылок на документы:

String documentsListEntityString = esiaPersonDataFetcher.apply(ESIA_REST_API_URL + "/prns/" + esiaAccountId + "/docs");

Затем десериализуем его:

EsiaListDto esiaDocumentsListDto = objectMapper.readValue(documentsListEntityString, EsiaListDto.class);
Переходим по каждой ссылке и получаем документы:
for (String documentUrl : esiaDocumentsListDto.getElementUrls()) {
  String documentEntityString = esiaPersonDataFetcher.apply(documentUrl);
  EsiaDocumentDto esiaDocumentDto = objectMapper.readValue(documentEntityString, EsiaDocumentDto.class);
}

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

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

Интегрироваться с ЕСИА могут:

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

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

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

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

Без авторизации есиа

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

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

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

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

Без авторизации есиа

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

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

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

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

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

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

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

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

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

Без авторизации есиа

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

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

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

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

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

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

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

Ошибка есиа ошибка входа доступ к личному кабинету недропользователя отсутствует

Без авторизации есиа

Ок, берем корректные сертификаты отсюда e-trust.gosuslugi.ru/MainCA и заменяем ручками. Ноль эффекта.
Местные казначеи сами в растерянности, в область не дозвониться.
Как думаете, уважаемые знатоки, это факап федерального масштаба, регионального или есть костыли и подорожник?

  • MotoArhangel
  • Не в сети
  • Сообщений: 296
  • Спасибо получено: 79

SibUrsus пишет: Добрый день!
Сегодня утром мы и еще многие пользователи столкнулись с проблемой авторизации в ЕСИА ака Госуслуги с помощью СКП федерального казначейства. «Электронная подпись недействительна. Попробуйте еще раз. Если ошибка сохранилась, пожалуйста, обратитесь в организацию, где было получено ваше средство электронной подписи. »
Заходим на www.gosuslugi.ru/pgu/eds загружаем файл .cer и наблюдаем картину маслом:

Без авторизации есиа

Ок, берем корректные сертификаты отсюда e-trust.gosuslugi.ru/MainCA и заменяем ручками. Ноль эффекта.
Местные казначеи сами в растерянности, в область не дозвониться.
Как думаете, уважаемые знатоки, это факап федерального масштаба, регионального или есть костыли и подорожник?

  • SibUrsus
  • Автор темы —>
  • Не в сети
  • Сообщений: 139
  • Спасибо получено: 21

MotoArhangel пишет: который нежданно аннулировали 22.07.2017

Как говорит современная молодежь. «проорал»
Да, проё продолб серьезный, от одной мысли о лишнем соитии с АРМ ГК начинает бить мелкая дрожь.

P.S. Привет соседям-сибирякам!

  • Alex_04
  • Не в сети
  • ТОФК
  • Сообщений: 2291
  • Спасибо получено: 381

MotoArhangel пишет: Проблема с корневым УЦ ФК. Т.е. все сертификаты выданные УЦ с использованием старого корневого сертификата (который нежданно аннулировали 22.07.2017) по факту являются не действительными.

  • MotoArhangel
  • Не в сети
  • Сообщений: 296
  • Спасибо получено: 79

MotoArhangel пишет: Проблема с корневым УЦ ФК. Т.е. все сертификаты выданные УЦ с использованием старого корневого сертификата (который нежданно аннулировали 22.07.2017) по факту являются не действительными.

О каком именно корневом серте УЦ ФК речь? На картинке, приведенной SibUrsus, не вижу ссылок на корневой серт старого УЦ ФК с датами действия с 28.06.2013 по 28.06.2018, под которым и создавались все казначейские серты пользователей, в т.ч. и для госуслуг. Вероятно для ЕСИА и ГУ дополнительно используются еще и другие корневые УЦ ФК. Тогда кому и главное ЗАЧЕМ взбрело в голову досрочно прихлопывать? (проблемы с ЭП возникли и в ЭБ судя по форуму).

А кому и зачем, это уже вопрос к Москве.

Немного теории по возникающей ошибке как в ЕСИА так и ЭБ.
УЭП -Усовершенствованная электронная подпись. Обеспечивает юридическую значимость документооборота путем добавления к электронной подписи информации, необходимой для локальной проверки электронной подписи и валидности сертификата на момент подписи

Перед отправкой документа выполняется проверка подписей на доведение до УЭП, а также проверка на полноту набора подписей. Если подписи документа не удовлетворяют требованиям, то документ не будет отправлен (статус передачи при этом не изменяется). Пользователю выводится сообщение о том, что «Подпись не доведена до УЭП»

Основная структура реализации:
Передается XML-документ, подписанный ЭП, возвращается XML-документ с УЭП или сообщение об ошибке. Для организации данной идеи используется так называемый ПКВС(Криптографический веб-сервис доведения ЭП до УЭП )

Вот на этом то этапе и возникает проблема, т.к. старый сертификат проверить нет возможности по причине наличию у ФК головного УЦ в виде Минкомсвязи. Еще раз изменена цепочка сертификатов(Цепочка доверия ). Из вышеизложенного не сложно догадаться как решился вопрос с подписью в ЭБ.

  • two_oceans
  • Не в сети
  • Сообщений: 183
  • Спасибо получено: 36

Немного технических подробностей: сертификат УЦ ФК 2013 года (с идентификатором ключа = 9e 71 0e 0f da b4 01 28 5f 3f e2 cb 8f 65 15 97 02 47 8c ab) мне известен в 3 вариантах (e-trust.gosuslugi.ru/CA/View?ogrn=1047797019830) — самоподписанный (с 28.06.2013 по 28.06.2018); кросс-сертификат, выпущенный УЦ 1 ИС ГУЦ (с 04.07.2013 по 04.07.2014); кросс-сертификат, ввыпущенный УЦ 2 ИС ГУЦ (с 01.07.2014 по 22.07.2017). Самоподписанный проверку на госуслугах проходит, а вот кроссы нет. Выпущенный УЦ 1 давно закончился и заменен на выпущенный УЦ 2. По поводу последнего еще интереснее — список отзыва, соответствующий сертификату УЦ2 (Идентификатор ключа: C66BC102A292AA140A0A4A14FD191D0D57D0449C), пуст, но сертификат УЦ2 тоже закончился 22.07.2017, при этом в списке отзыва ГУЦ его нет. Проверил по архиву скачанному полгода назад, там тоже кросс УЦ ФК, выпущенный УЦ2 заканчивается 22.07.2017, так что ничего не подкорректировано.

Если локально установить самоподписанный вариант, то локальная цепочка доверия восстановится. Проблема в том, что ГАС/ГИС/ЕИС проверяют цепочку от ГУЦ в рамках единого пространства доверия, а нет от самоподписанного сертификата УЦ ФК. У меня установлен самоподписанный вариант, но ГАС «Управление» отклоняет сертификат. Однако ЕСИА принимает.

В целом, ситуацию можно оценить так: когда сертификат УЦ ФК перевыпускался на УЦ2, срок действия ограничили по сроку действия сертификата УЦ2, но об этом факте все как-то забыли. Сейчас получается ничего не аннулировали, просто штатно закончился срок действия УЦ2 и с ним кросс УЦ ФК. Соответственно, сертификат УЦФК 2013 года выпал из единого пространства доверия. Вопрос «кому и зачем» отпадает.

Предисловие

Без авторизации есиа

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

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

Без авторизации есиа

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

Читайте также:  По уходу за инвалидом 1 группы с 1 января 2022 года сколько платят пособие

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

Что делать и как?

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

Для начала важно было наметить план действий. Наш план включал следующие основные шаги:

  1. зарегистрироваться на технологическом портале ЕСИА;
  2. подать заявки на использование программных интерфейсов ЕСИА в тестовой и промышленной среде;
  3. самостоятельно разработать механизм взаимодействия с ЕСИА (в соответствии с действующим документом «Методические рекомендации по использованию ЕСИА»);
  4. протестировать работу механизма в тестовой и промышленной среде ЕСИА.

Обычно мы разрабатываем наши проекты на Java. Поэтому для программной реализации выбрали:

  • IntelliJ IDEA;
  • КриптоПро JCP (или КриптоПро Java CSP);
  • Java 8;
  • Apache HttpClient;
  • Lombok;
  • FasterXML/Jackson.

Перенаправление в ЕСИА и аутентификация

Начнем пошаговую реализацию с пунктов 1-4: нам нужно перенаправить пользователя на сервис аутентификации ЕСИА (EsiaAuthUrl). В зависимости от среды (тестовая или продуктив) различается базовый адрес url – для тестовой среды это https://esia-portal1.test.gosuslugi.ru/aas/oauth2/ac. Полный адрес получается таким:

{EsiaAuthUrl}?client_id={ClientId}&scope={Scope}&response_type=code&state={State}& timestamp={Timestamp}&access_type=online&redirect_uri={RedirectUri}&client_secret={ClientSecret}

где RedirectUri – адрес, на который будет направлен ответ от ЕСИА, а ClientSecret – результат выполнения функции GetClientSecret. Остальные параметры описаны ранее.

Учётная запись ЕСИА

Для чего ЕСИА

Учётная запись создаётся пользователем самостоятельно в момент регистрации на сайте Госуслуг.

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

В ЕСИА существует 3 типа учетных записей:

  1. Упрощенная.
  2. Стандартная.
  3. Подтвержденная.

Упрощенная: для регистрации требуется имя и фамилия, а также номер телефона или адрес электронной почты. Перечень госуслуг – ограничен. Некоторые сайты отказывают в доступе к сведениям.

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

Подтвержденная: данные пользователя прошли проверку во всех инстанциях, личность – подтверждена. Перечень госуслуг – исчерпывающий.

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

Валидация токена

public static boolean isEsiaSignatureValid(String data, String dataSignature) throws Exception {
  InputStream inputStream = EsiaUtil.class.getClassLoader().getResourceAsStream(CERTIFICATE); // Публичный ключ ЕСИА, представленный как поток
  CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); // Создание объекта фабрики с указанием стандарта открытого ключа X.509
  X509Certificate certificate = (X509Certificate) certFactory.generateCertificate(inputStream);
  Signature signature = Signature.getInstance(certificate.getSigAlgName(), new JCP()); // Создание экземпляра класса Signature с указанием алгоритма подписи и провайдера JCP от КриптоПро
  signature.initVerify(certificate.getPublicKey()); // Инициализация открытого ключа для верификации
  signature.update(data.getBytes()); // Загрузка байтового массива строки, которую нужно верифицировать 
  return signature.verify(Base64.getUrlDecoder().decode(dataSignature));
}

В соответствии с методическими указаниями необходимо проверять срок действия маркера. Если срок действия истек, то нужно создать новую ссылку с дополнительными параметрами и сделать запрос с помощью http-клиента:

URI refreshTokenUri = new URIBuilder(ESIA_TOKEN_API_URL)
        .addParameters(Arrays.asList(
                new BasicNameValuePair(RequestEnum.CLIENT_ID.getParam(), requestDto.getClientId()),
                new BasicNameValuePair(RequestEnum.REFRESH_TOKEN.getParam(), tokenResponseDto.getRefreshToken()),
                new BasicNameValuePair(RequestEnum.CODE.getParam(), code),
                new BasicNameValuePair(RequestEnum.GRANT_TYPE.getParam(), EsiaConstants.REFRESH_GRANT_TYPE),
                new BasicNameValuePair(RequestEnum.STATE.getParam(), requestDto.getState()),
                new BasicNameValuePair(RequestEnum.SCOPE.getParam(), requestDto.getScope()),
                new BasicNameValuePair(RequestEnum.TIMESTAMP.getParam(), requestDto.getTimestamp()),
                new BasicNameValuePair(RequestEnum.TOKEN_TYPE.getParam(), requestDto.getTokenType()),
                new BasicNameValuePair(RequestEnum.CLIENT_SECRET.getParam(), requestDto.getClientSecret()),
                new BasicNameValuePair(RequestEnum.REDIRECT_URI.getParam(), requestDto.getRedirectUri())
        ))
        .build();

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

Имея токен доступа и идентификатор пользователя можно получить данные о пользователе из ЕСИА. Рассмотрим пример получения ФИО пользователя и его организации. Для этого формируем GET запрос в REST API ЕСИА, для тестового контура базовый url (EsiaRestUrl) будет таким: https://esia-portal1.test.gosuslugi.ru/rs. Токен доступа передается в заголовке запроса, сам код выглядит следующим образом:

/// <summary>
/// Получить данные пользователя
/// </summary>
/// <param name="userId">Идентификатор пользователя</param>
/// <param name="accessToken">Токен доступа</param>
/// <returns>Данные пользователя</returns>
public async Task<EsiaUser> GetUser(string userId, string accessToken)
{
	using (var client = new HttpClient())
	{
		client.DefaultRequestHeaders.Clear();
		client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

		var response = await client.GetStringAsync($"{Configuration.EsiaRestUrl}/prns/{userId}?embed=(organizations)");
		var user = JsonConvert.DeserializeObject<EsiaUser>(response);
		user.Id = user.Id ?? userId;

		return user;
	}
}

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

/// <summary>
/// Пользователь ЕСИА
/// </summary>
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("trusted")]
	public bool Trusted { get; set; }

	/// <summary>
	/// Ссылки на организации
	/// </summary>
	[JsonProperty("organizations")]
	public EsiaUserOrganizations OrganizationLinks { get; set; }
}

/// <summary>
/// Ссылки на организации
/// </summary>
public class EsiaUserOrganizations
{
	[JsonProperty("elements")]
	public List<string> Links { get; set; }
}

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

Для получение каких-либо данных в ЕСИА нам нужно получить токен доступа. Для этого формируем POST запрос в ЕСИА (для тестовой среды базовый url такой: https://esia-portal1.test.gosuslugi.ru/aas/oauth2/te — EsiaTokenUrl). Основные поля запроса тут формируются аналогичным образом, в коде получается примерно следующее:

/// <summary>
/// Получить токен доступа
/// </summary>
/// <param name="code">Код доступа для получения кода доступа</param>
/// <param name="callbackUrl">Коллбек адрес для редиректа после автризации</param>
/// <param name="certificate">Сертификат для подписи запросов</param>
/// <returns>Токен доступа</returns>
public async Task<EsiaAuthToken> GetAccessToken(
	string code,
	string callbackUrl = null,
	X509Certificate2 certificate = null)
{
	var timestamp = DateTime.UtcNow.ToString("yyyy.MM.dd HH:mm:ss +0000");
	var state = Guid.NewGuid().ToString("D");

	// Create signature in PKCS#7 detached signature UTF-8
	var clientSecret = GetClientSecret(
		certificate,
		Configuration.Scope,	// Скоуп запроса
		timestamp,
		Configuration.ClientId,	// Идентификатор ИС
		state);

	var requestParams = new List<KeyValuePair<string, string>>
	{
		new KeyValuePair<string, string>("client_id", Configuration.ClientId),
		new KeyValuePair<string, string>("code", code),
		new KeyValuePair<string, string>("grant_type", "authorization_code"),
		new KeyValuePair<string, string>("state", state),
		new KeyValuePair<string, string>("scope", Configuration.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", callbackUrl)
	};
	using (var client = new HttpClient())
	using (var response = await client.PostAsync(Configuration.EsiaTokenUrl, new FormUrlEncodedContent(requestParams)))
	{
		response.EnsureSuccessStatusCode();
		var tokenResponse = await response.Content.ReadAsStringAsync();

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

		Argument.NotNull(token?.AccessToken, "Не найден токен доступа");
		Argument.Require(state == token.State, "Идентификатор запроса некорректный");

		return token;
	}
}

Некоторые статичные параметры запроса получаем из файла конфигурации (поле Configuration). Как мы можем видеть, поле code запроса заполняется значением кода аутентификации, полученным ранее. Для десериализации ответа используется следующие классы:

/// <summary>
/// Ответ от ЕСИА с токеном доступа
/// </summary>
public class EsiaAuthToken
{
	/// <summary>
	/// Токен доступа
	/// </summary>
	[JsonProperty("access_token")]
	public string AccessToken { get; set; }

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

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

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

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

/// <summary>
/// Данные из токена доступа
/// </summary>
public class EsiaAuthTokenPayload
{
	/// <summary>
	/// Идентификатор токена
	/// </summary>
	[JsonProperty("urn:esia:sid")]
	public string TokenId { get; set; }

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

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

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

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

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

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

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

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

Без авторизации есиа

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

Без авторизации есиа

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

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

Что теперь делать со всеми этими данными?

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

Пример получения объекта с необходимыми полями:

final ObjectMapper objectMapper = new ObjectMapper()
	.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

String personDataEntityString = esiaPersonDataFetcher
	.apply(ESIA_REST_API_URL + "/prns/" + esiaAccountId);

EsiaPersonDto esiaPersonDto = objectMapper
	.readValue(personDataEntityString, EsiaPersonDto.class);

Заполняем объект esiaPersonDto необходимыми данными, например, контактами:

for (String contactUrl : esiaListDto.getElementUrls()) {
  String contactEntityString = esiaPersonDataFetcher.apply(contactUrl);
  EsiaContactDto esiaContactDto = objectMapper.readValue(contactEntityString, EsiaContactDto.class); // Десериализация контакта
  if (esiaContactDto.getType() == null) continue;
  switch (esiaContactDto.getType().toUpperCase()) {
    case EsiaContactDto.MBT: // Если это номер мобильного телефона, то заполним поле mobilePhone
      esiaPersonDto.setMobilePhone(esiaContactDto.getValue());
      break;
    case EsiaContactDto.EML: // Если это адрес электронной почты, то заполним поле email
      esiaPersonDto.setEmail(esiaContactDto.getValue());
  }
}

Класс EsiaPersonDto выглядит следующим образом:

@Data
@FieldNameConstants(prefix = "")
public class EsiaPersonDto {

  private String firstName;
  private String lastName;
  private String middleName;
  private String birthDate;
  private String birthPlace;
  private Boolean trusted;  // тип учетной записи - подтверждена (“true”) / не подтверждена (“false”)
  private String status;    // статус УЗ - Registered (зарегистрирована) /Deleted (удалена)
  // Назначение полей непонятно, но они есть при запросе /prns/{oid}
  private List<String> stateFacts;
  private String citizenship;
  private Long updatedOn;
  private Boolean verifying;
  @JsonProperty("rIdDoc")
  private Integer documentId;
  private Boolean containsUpCfmCode;
  @JsonProperty("eTag")
  private String tag;
  // ----------------------------------------
  private String mobilePhone;
  private String email;

  @javax.validation.constraints.Pattern(regexp = "(\\d{2})\\s(\\d{2})")
  private String docSerial;

  @javax.validation.constraints.Pattern(regexp = "(\\d{6})")
  private String docNumber;

  private String docIssueDate;

  @javax.validation.constraints.Pattern(regexp = "([0-9]{3})\\-([0-9]{3})")
  private String docDepartmentCode;

  private String docDepartment;

  @javax.validation.constraints.Pattern(regexp = "\\d{14}")
  @JsonProperty("snils")
  private String pensionFundCertificateNumber;

  @javax.validation.constraints.Pattern(regexp = "\\d{12}")
  @JsonProperty("inn")
  private String taxPayerNumber;

  @JsonIgnore
  @javax.validation.constraints.Pattern(regexp = "\\d{2}")
  private String taxPayerCertificateSeries;

  @JsonIgnore
  @javax.validation.constraints.Pattern(regexp = "\\d{10}")
  private String taxPayerCertificateNumber;
}

Работа по усовершенствованию сервиса будет продолжаться, ведь ЕСИА не стоит на месте.

Читайте также:  Создать организацию есиа

Инструкция по формированию заявки электронного аукциона на ЭТП Сбербанк-АСТ

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

Преимущества подтвержденного аккаунта

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

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

Получение URL для переадресации

Первый шаг ― это получение авторизационного кода. В нашем случае это делает отдельный сервис с переадресацией на страницу авторизации портала Госуслуг (расскажем об этом немного подробнее).

Сначала мы инициализируем переменные ESIA_AUTH_URL (адрес ЕСИА) и API_URL (адрес, на который происходит редирект в случае успешной авторизации). После этого создаем объект EsiaRequestParams, который содержит в своих полях параметры запроса к ЕСИА, и сформируем ссылку esiaAuthUri.

public Response loginByEsia() throws Exception {
  final String ESIA_AUTH_URL = dao.getEsiaAuthUrl(); // Адрес ЕСИА
  final String API_URL = dao.getApiUrl(); // Адрес, на который произойдет редирект с случае успешной авторизации
  EsiaRequestParams requestDto = new EsiaRequestParams(API_URL);
  URI esiaAuthUri = new URIBuilder(ESIA_AUTH_URL)
          .addParameters(Arrays.asList(
            new BasicNameValuePair(RequestEnum.CLIENT_ID.getParam(), requestDto.getClientId()),
            new BasicNameValuePair(RequestEnum.SCOPE.getParam(), requestDto.getScope()),
            new BasicNameValuePair(RequestEnum.RESPONSE_TYPE.getParam(), requestDto.getResponseType()),
            new BasicNameValuePair(RequestEnum.STATE.getParam(), requestDto.getState()),
            new BasicNameValuePair(RequestEnum.TIMESTAMP.getParam(), requestDto.getTimestamp()),
            new BasicNameValuePair(RequestEnum.ACCESS_TYPE.getParam(), requestDto.getAccessType()),
            new BasicNameValuePair(RequestEnum.REDIRECT_URI.getParam(), requestDto.getRedirectUri()),
            new BasicNameValuePair(RequestEnum.CLIENT_SECRET.getParam(), requestDto.getClientSecret())
          ))
          .build();
  return Response.temporaryRedirect(esiaAuthUri).build();
}

Для наглядности покажем, как может выглядеть класс EsiaRequestParams:

public class EsiaRequestParams {

  String clientId;
  String scope;
  String responseType;
  String state;
  String timestamp;
  String accessType;
  String redirectUri;
  String clientSecret;
  String code;
  String error;
  String grantType;
  String tokenType;

  public EsiaRequestParams(String apiUrl) throws Exception {
    this.clientId = CLIENT_ID;
    this.scope = Arrays.stream(ScopeEnum.values())
            .map(ScopeEnum::getName)
            .collect(Collectors.joining(" "));
    responseType = RESPONSE_TYPE;
    state = EsiaUtil.getState();
    timestamp = EsiaUtil.getUrlTimestamp();
    accessType = ACCESS_TYPE;
    redirectUri = apiUrl + RESOURCE_URL + "/" + AUTH_REQUEST_ESIA;
    clientSecret = EsiaUtil.generateClientSecret(String.join("", scope, timestamp, clientId, state));
    grantType = GRANT_TYPE;
    tokenType = TOKEN_TYPE;
  }
}

Каждый запрос к ЕСИА имеет параметр client_secret, который представляет собой откреплённую электронную подпись в формате PKCS7 (Public Key Cryptography Standard). В нашем случае для подписи используется сертификат, который был получен удостоверяющим центром перед началом работ по интеграции с ЕСИА. Как работать с хранилищем ключей хорошо описано в этом цикле статей.

Для примера покажем, как выглядит хранилище ключей, предоставляемое компанией КриптоПро:

Без авторизации есиа

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

KeyStore keyStore = KeyStore.getInstance("HDImageStore"); // Создание экземпляра хранилища
keyStore.load(null, null);
PrivateKey privateKey = (PrivateKey) keyStore.getKey(esiaKeyStoreParams.getName(), esiaKeyStoreParams.getValue().toCharArray()); // Получение приватного ключа
X509Certificate certificate = (X509Certificate) keyStore.getCertificate(esiaKeyStoreParams.getName()); // Получение сертификата, он же – открытый ключ.

Где JCP.HD_STORE_NAME ― имя хранилища в КриптоПро, esiaKeyStoreParams.getName() ― имя контейнера и esiaKeyStoreParams.getValue().toCharArray() ― пароль контейнера.
В нашем случае не нужно загружать данные в хранилище методом load(), так как ключи уже будут там при указании имени этого хранилища.

Здесь важно помнить, что получения подписи в виде

final Signature signature = Signature.getInstance(SIGN_ALGORITHM, PROVIDER_NAME);
signature.initSign(privateKey);
signature.update(data);
final byte[] sign = signature.sign();

нам недостаточно, так как ЕСИА требует откреплённую подпись формата PKCS7. Поэтому следует создать подпись формата PKCS7.

Пример нашего метода, возвращающего откреплённую подпись, выглядит следующим образом:

public String generateClientSecret(String rawClientSecret) throws Exception {
    if (this.localCertificate == null || this.esiaCertificate == null) throw new RuntimeException("Signature creation is unavailable");
    return CMS.cmsSign(rawClientSecret.getBytes(), localPrivateKey, localCertificate, true);
  }

Здесь мы проверяем наличие нашего открытого ключа и открытого ключа ЕСИА. Так как метод cmsSign() может содержать конфиденциальную информацию, мы не будем его раскрывать.

Укажем лишь некоторые детали:

  • rawClientSecret.getBytes() ― байтовый массив scope, timestamp, clientId и state;
  • localPrivateKey ― приватный ключ из контейнера;
  • localCertificate ― публичный ключ из контейнера;
  • true ― булево значение параметра подписи ― открепленная или нет.

Пример создания подписи можно найти в java-библиотеке КриптоПро, там стандарт PKCS7 называется CMS. А также в руководстве программиста, которое лежит вместе с исходниками скаченной версии КриптоПро.

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

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

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

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

Без авторизации есиа

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

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

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

Без авторизации есиа

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

Получение токена

Следующий шаг ― получение маркера доступа (он же токен) в обмен на авторизационный код, который был получен в качестве параметра при успешной авторизации пользователя на портале Госуслуг.

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

URI getTokenUri = new URIBuilder(ESIA_TOKEN_API_URL)
        .addParameters(Arrays.asList(
          new BasicNameValuePair(RequestEnum.CLIENT_ID.getParam(), requestDto.getClientId()),
          new BasicNameValuePair(RequestEnum.CODE.getParam(), code),
          new BasicNameValuePair(RequestEnum.GRANT_TYPE.getParam(), requestDto.getGrantType()),
          new BasicNameValuePair(RequestEnum.CLIENT_SECRET.getParam(), requestDto.getClientSecret()),
          new BasicNameValuePair(RequestEnum.STATE.getParam(), requestDto.getState()),
          new BasicNameValuePair(RequestEnum.REDIRECT_URI.getParam(), requestDto.getRedirectUri()),
          new BasicNameValuePair(RequestEnum.SCOPE.getParam(), requestDto.getScope()),
          new BasicNameValuePair(RequestEnum.TIMESTAMP.getParam(), requestDto.getTimestamp()),
          new BasicNameValuePair(RequestEnum.TOKEN_TYPE.getParam(), requestDto.getTokenType())
        ))
        .build();
HttpUriRequest getTokenPostRequest = RequestBuilder.post()
        .setUri(getTokenUri)
        .setHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded")
        .build();

Получив ответ, распарсим его и получим токен:

try (CloseableHttpResponse response = httpClient.execute(getTokenPostRequest)) {
  HttpEntity tokenEntity = response.getEntity();
  String tokenEntityString = EntityUtils.toString(tokenEntity);
  tokenResponseDto = extractEsiaGetResponseTokenDto(tokenEntityString);
}

Токен представляет собой строку, состоящую из трёх частей и разделённых точками: HEADER.PAYLOAD.SIGNATURE, где:

  • HEADER ― это заголовок, имеющий в себе свойства токена, в том числе алгоритм подписи;
  • PAYLOAD ― это информация о токене и субъекте, которую запрашиваем у Госуслуг;
  • Signature ― это подпись HEADER.PAYLOAD.

Зачем нам нужна интеграция с ЕСИА?

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

Без авторизации есиа

Кроме того, интеграция с ЕСИА позволила Русфинанс Банку:

  • сократить время заполнения онлайн-анкет;
  • уменьшить количество отказов пользователей при попытке заполнить большое количество полей вручную;
  • обеспечить поток более «качественных», верифицированных клиентов.

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

Базовая информация

Мы реализовали сервис интеграции с ЕСИА под Windows, используя КриптоПро CSP. В теории скорее всего можно это все аккуратно упаковать в docker и положить в Linux-образные системы, оставим это на откуп читателю. Для нас же актуальным стеком был следующий:

  • .Net Framework 4.8
  • КриптоПро CSP, КриптоПро .Net
  • Сертификат с закрытым ключом, полученный при регистрации ИС в реестре ИС ЕСИА (на пункте 1 из Введения)

Каждый запрос в ЕСИА по соображениям безопасности дополняется полем client_secret, которое формируется как открепленная подпись 4 полей запроса в формате UTF-8:

  • Scope (Скоуп запроса, перечень данных, которые нужно получить из ЕСИА). Например, «fullname gender email mobile usr_org»
  • Timestamp (Текущие дата и время в формате «yyyy.MM.dd HH:mm:ss +0000»)
  • ClientId (Идентификатор ИС, который выдается при регистрации системы в ЕСИА)
  • State (Идентификатор текущего запроса, каждый раз генерируется как Guid.NewGuid().ToString(«D»))

private string GetClientSecret(
	X509Certificate2 certificate, 
	string scope, 
	string timestamp, 
	string clientId, 
	string state)
{
	var signMessage = Encoding.UTF8.GetBytes($"{scope}{timestamp}{clientId}{state}");

	byte[] encodedSignature = SignatureProvider.Sign(signMessage, certificate);
 
	return Base64UrlEncoder.Encode(encodedSignature);
}

Тут SignatureProvider – класс для реализации работы с сертификатами, он довольно просто реализуется. Для подписи использовался алгоритм ГОСТ – импортозамещение и все такое.

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

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

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

Как войти на сайт через ЕСИА?

  1. Загрузите главную страницу портала, выберите «Войти».
  2. Укажите пароль от учетной записи, который вы создали во время регистрации.
  3. Дождитесь поступления проверочного кода в СМС, введите его в открывшемся поле на сайте. Авторизация завершена.
Оцените статью