- Рутокен от сбера и госуслуги
- Рутокен от сбера и госуслуги
- Николай Киблицкий
- Re: Рутокен от сбера и госуслуги
- AlexineD
- Re: Рутокен от сбера и госуслуги
- Василий Рутокенов
- Re: Рутокен от сбера и госуслуги
- AlexineD
- Re: Рутокен от сбера и госуслуги
- endemic
- Re: Рутокен от сбера и госуслуги
- Master
- Re: Рутокен от сбера и госуслуги
- Фатеева Светлана
- Re: Рутокен от сбера и госуслуги
- Олег1984
- Re: Рутокен от сбера и госуслуги
- Фатеева Светлана
- Re: Рутокен от сбера и госуслуги
- Олег1984
- Re: Рутокен от сбера и госуслуги
- Опыт получения токена закрытого ключа для Единого Портала Госуслуг
- Зачем это надо?
- Что это?
- Как это?
- Осторожно, грабли!
- Использование с порталом госуслуг
- Зачем нам ЕСИА?
- Стек и схема интеграции
- Формирование подписи
- Создание ссылки для редиректа на страницу ЕСИА
- Получение авторизационного токена ЕСИА
- Запрос токена идентификации
- Получение данных о пользователе
- Полезные материалы по теме
- Авторизация на портале Госуслуг с помощью Рутокен ЭЦП
- 50 ответов
- Добавить комментарий
Рутокен от сбера и госуслуги
- AlexineD
Рутокен от сбера и госуслуги
Добрый день!
Имеем зеленый рутокен от сбера.
Соответственно в панели управления рутокен он не видится.
В КП 5 (12600) все нормально видится и дает установить сертификат.
В ЛК ФНС по ЭП входит.
А вот на госуслуги НЕТ. Пишет
На подключённом носителе нет действующих подписей
Плагин госслуг установлен и включен.
Браузеры пробовал разные (все что есть можно сказать) но врятли в них дело
WIN64 10
Подскажите пожалуйста куда копать?
Николай Киблицкий
- Николай Киблицкий
Re: Рутокен от сбера и госуслуги
Здравствуйте AlexineD
, по вопросам поддержки продукта «Рутокен TLS» необходимо обращаться в техническую поддержку «Сбербанк».
Телефон для обращений 8-800-5555-777 доб.3, или с мобильного 0321.
AlexineD
- AlexineD
Re: Рутокен от сбера и госуслуги
По телефону сбербанк сказал, что Плагин госуслуг не понимает Рутокен TLS.
Т.е. работать не будет
Василий Рутокенов
- Василий Рутокенов
Re: Рутокен от сбера и госуслуги
Понимает, даже можно входить в личный кабинет организации на ЕПГУ.
При авторизации в личном кабинете, при обращении к контейнеру открывается окно Выбора ключевого носителя, нажимаете кнопку ОК, потом ещё раз нажимаете кнопку ОК, далее нажимаете кнопку Отмена. Вуаля, у вас открывается окно выбора сертификата. Там выбирается Сбербанк.
AlexineD
- AlexineD
Re: Рутокен от сбера и госуслуги
Василий Рутокенов пишет:
Понимает, даже можно входить в личный кабинет организации на ЕПГУ.
При авторизации в личном кабинете, при обращении к контейнеру открывается окно Выбора ключевого носителя, нажимаете кнопку ОК, потом ещё раз нажимаете кнопку ОК, далее нажимаете кнопку Отмена. Вуаля, у вас открывается окно выбора сертификата. Там выбирается Сбербанк.
Вы точно говорите про Рутокен TLS.
Дело в том что при авторизации в есиа сертификат ен видится, т.к. плагин не умеет работать с этим типом носителя
endemic
- endemic
Re: Рутокен от сбера и госуслуги
P. S При выполнении комманды
/opt/cprocsp/bin/amd64/certmgr -list -store uMy
сертификат ООО виден, действителен до сентября 2023
Master
- Master
Re: Рутокен от сбера и госуслуги
На windows тоже была такая проблема с госуслугами. Мне удалось зайти через firefox.
Фатеева Светлана
- Фатеева Светлана
Re: Рутокен от сбера и госуслуги
Здравствуйте, endemic
,
пришлите пожалуйста скриншот ошибки входа на портал Госуслуг.
Олег1984
- Олег1984
Re: Рутокен от сбера и госуслуги
Добрый день.
Проблема аналогичная, только ОС win 11 64.

Фатеева Светлана
- Фатеева Светлана
Re: Рутокен от сбера и госуслуги
Здравствуйте, Олег1984
,
Пришлите пожалуйста скриншот «Панели управления Рутокен» на вкладке Сертификаты.
Олег1984
- Олег1984
Re: Рутокен от сбера и госуслуги
Техподдержка сбербанка дала однозначный ответ: Плагин Госуслуги не работает с Рутокен TLS.
Решение: аннулировать подпись в личном кабинете сбербанка и перевыпустить сертификат на другой носитель, например, Рутокен Lite.
Опыт получения токена закрытого ключа для Единого Портала Госуслуг
Всё нижеописанное относится к физлицам Российской Федерации.
Зачем это надо?
Что это?
По существу — это устройство eToken ГОСТ, объединяющее в одном корпусе функционал JavaCard/PKCS11-смарткарты и USB HID ридера, так что драйверы ему не нужны.
При выдаче токена сертификат открытого ключа привязывается к вашим регистрационным данным: СНИЛС, ФИО, E-Mail. Действует год. Стоит 660 рублей. Позволяет формировать квалифицированную (т.е. удостоверенную аккредитованным УЦ) электронную подпись, являющуюся юридически значимым аналогом собственноручной.
Как это?
На момент принятия решения я уже был зарегистрирован на портале госуслуг, и имел активированную учетную запись. Это делает процедуру получения тривиальной.
Итак, идете в офис обслуживания клентов Ростелекома, уполномоченный выдавать токены и активировать учетные записи к порталу госуслуг.
Список доступен для скачивания на самом портале.
Предполагается, что у вас уже есть активированная учетная запись на портале, либо, по крайней мере вы там зарегистрированы, и выбрали способ активации «В офисе Ростелекома». То есть дома регистрируетесь на портале, потом идете в офис Ростелекома.
Если учетная запись не активирована — там же, в офисе активируете её, предъявив СНИЛС и паспорт.
После активации оплачиваете 660 рублей в кассу, и подписываете четыре или пять листиков — согласие на обработку персональных данных, заявление на выдачу ключа, акт приемки-сдачи, и что-то еще.
Вам выдают памятку по использованию ЭП, копию акта, и бланк сертификата открытого ключа. Последнее — по сути дамп сертификата, загруженного в токен. Да, и конечно же выдают сам токен — маленькую фиолетовую «флэшечку».
Всё, поздравляю. Теперь вы можете подписывать юридически значимые документы направо и налево.
Осторожно, грабли!
Использование с порталом госуслуг
Привет, Хабр! В одном из постов блога мой коллега Иван писал
о нашем блокчейн-сервисе для онлайн-голосований WE. Vote. Он подробно разобрал, как работает WE. Vote с точки зрения технологий. Но чтобы сервисы удаленного голосования можно было использовать для принятия официальных решений юрлиц, не хватает еще одного важного компонента — достоверной верификации участников. В России для этого можно провести интеграцию с ЕСИА (Единой Системой Идентификации и Аутентификации) — проще говоря, с Госуслугами. Интеграция эта заметно отличается от интеграции с другими OAuth2-сервисами, как, например, Google или VK. В этом посте мы постараемся помочь тем, кто захочет интегрировать ЕСИА в свой сервис через стек, подобный нашему, а также дадим несколько полезных ссылок по ЕСИА в принципе.

Зачем нам ЕСИА?
Согласно Федеральному закону № 225-ФЗ
от 28.06.2021 «О внесении изменений в часть первую Гражданского кодекса Российской Федерации», многие организаций в РФ получили право проводить официальные собрания и голосования по корпоративным вопросам дистанционно.
Ранее решения с юридической силой требовали очных собраний или голосований по почте. Голосования по почте не отличаются надежностью, а собрать много руководителей со всей России в одном месте — это кошмар с точки зрения затрат.
Чтобы проводить мероприятия принятия решения дистанционно в соответствии с новым федеральным законом, необходимо предоставить возможность достоверного установления личности участников. В России это возможно через проверку доступа к верифицированному аккаунту на Госуслугах.
Стек и схема интеграции
Для интеграции мы используем:
Typescript, ReactJS, NestJS
КриптоПро CSP 4

Формирование подписи
Прежде чем разбирать все по порядку, кое о чем стоит подумать заранее. В отличие от других интеграций, запросы к ЕСИА должны сопровождаться подписью ГОСТ Р 34.10/11-2012, а не просто API key. Создать такую подпись можно с помощью утилиты КриптоПро CSP
. Для нас основная задача здесь — правильно обернуть эту утилиту в Docker, чтобы с ней можно было работать как с отдельным сервисом в рамках нашей инфраструктуры. Получившийся сервис мы выложили в открытый доступ на гитхабе
. Инструкция по запуску есть в README.md.
В процесс сборки Docker образа сервиса с утилитой КриптоПро мы встроили:
Установку утилиты КриптоПро СSP 4 из .deb пакета
Установку лицензии КриптоПро
Загрузку корневого сертификата тестовой или основной среды ЕСИА
Загрузку пользовательского сертификата с PIN кодом
REST-сервер с методом, позволяющим создавать подписи
Таким образом вся криптография собрана в отдельном самостоятельном компоненте, который можно использовать, когда необходимо что-нибудь подписать. Вот как это выглядит на бэкенде:
private async signParams(params: Record<string, string>) {
const time = moment().format('YYYY.MM.DD HH:mm:ss ZZ')
const state = uuid()
const clientId = this.clientId
const scope = this.scope
const { data: { result: clientSecret } } = await axios.post<{ result: string }>(
`${this.cryptoProServiceAddress}/cryptopro/sign`,
{ text: [scope, time, clientId, state].join('') },
)
return {
...params,
timestamp: time,
client_id: clientId,
scope,
state,
client_secret: clientSecret.replace(/\n/g, ''),
}
}
С созданием подписей разобрались, теперь последовательно разберем, как реализовать схему выше.
Создание ссылки для редиректа на страницу ЕСИА
Все начинается с того, что пользователь решает пройти авторизацию через ЕСИА. Создаем на бэкенде ссылку для перехода с использованием нашего инструмента формирования подписей.
async getAuthLink(redirectLink: string) {
const params = await this.signParams({
redirect_uri: redirectLink,
response_type: 'code',
access_type: 'offline',
})
const authQuery = new URLSearchParams(params)
const authURL = `${this.esiaHost}/aas/oauth2/ac`
return `${authURL}?${authQuery}`
}
В redirectLink
необходимо указать адрес страницы, на которую ЕСИА перенаправит пользователя после успешной аутентификации. Созданную ссылку возвращаем на фронтенд и перенаправляем на нее пользователя.
Получение авторизационного токена ЕСИА
Запрос токена идентификации
После успешной аутентификации на странице ЕСИА пользователь возвращается на фронтенд приложения по указанному нами адресу. Е СИА передаёт авторизационный токен в виде get-параметра code
. Этот токен необходимо передать на бэкенд и запросить с его помощью идентификационный токен пользователя.
async getTokens(code: string) {
try {
const params = await this.signParams({
grant_type: 'authorization_code',
token_type: 'Bearer',
redirect_uri: 'no',
code,
})
const authURL = `${this.host}/aas/oauth2/te`
const authQuery = new URLSearchParams(params)
const { data: tokens } = await axios.post(`${authURL}?${authQuery}`)
return {
idToken: tokens.id_token,
accessToken: tokens.access_token,
refreshToken: tokens.refresh_token,
}
} catch (e) {
const status = e.response ? e.response.status : 500
const message = e.response ? e.response.data.error_description : e.message
throw new HttpException('Failed to get auth tokens: ' + message, status)
}
}
Получение данных о пользователе
Идентификационный токен пользователя необходимо проверить с помощью публичного RSA ключа от ЕСИА и получить из него id
пользователя. С помощью этого id
и accessToken
, который мы получили в предыдущем шаге, мы уже наконец можем запросить персональные данные пользователя.
getUserIdFromToken(idToken: string) {
const decodedIdToken = verify(idToken, this.esiaPublicKey, {
algorithms: ['RS256'],
audience: 'WE_VOTE',
}) as EsiaParsedToken
return decodedIdToken['urn:esia:sbj']['urn:esia:sbj:oid']
}
async getUserInfo(tokens: EsiaTokens) {
const { idToken, accessToken } = tokens
const oId = this.getUserIdFromToken(idToken)
const [{ data: mainInfo }, { data: contactsInfo }] = await Promise.all([
axios.get(`${this.esiaHost}/rs/prns/${oId}`, {
headers: {
Authorization: `Bearer ${accessToken}`,
},
}),
axios.get(`${this.esiaHost}/rs/prns/${oId}/ctts?embed=(elements)`, {
headers: {
Authorization: `Bearer ${accessToken}`,
},
}),
])
const email = contactsInfo.elements.find(({ type }: { type: string }) => type === 'EML')
return {
id: oId,
firstName: mainInfo.firstName,
lastName: mainInfo.lastName,
surName: mainInfo.middleName,
trusted: mainInfo.trusted,
email: email ? {
value: email.value.toLowerCase(),
verified: email.vrfStu === 'VERIFIED',
} : null,
}
}
На этом шаге мы уже имеем все необходимые данные о пользователе. Остается только занести их в свою систему и закончить авторизацию.
Полный код интеграционного модуля на бэкенде
import { HttpException } from '@nestjs/common'
import * as moment from 'moment'
import { v4 as uuid } from 'uuid'
import { URLSearchParams } from 'url'
import axios from 'axios'
import { verify } from 'jsonwebtoken'
type EsiaTokens = {
idToken: string,
accessToken: string,
}
type EsiaParsedToken = {
'urn:esia:sbj': {
'urn:esia:sbj:oid': string,
},
}
export class EsiaApiService {
private readonly clientId = 'WE_VOTE'
private readonly scope = ['openid', 'email', 'fullname'].join(' ')
constructor(
private readonly esiaHost: string, // 'https://esia-portal1.test.gosuslugi.ru' или 'https://esia.gosuslugi.ru'
private readonly esiaPublicKey: string, // можно взять из http://esia.gosuslugi.ru/public/esia.zip
private readonly cryptoProServiceAddress: string, // адрес сервиса по созданию подписей e.g 'http://127.0.0.1:3037'
) {
}
async getAuthLink(redirectLink: string) {
const params = await this.signParams({
redirect_uri: redirectLink,
response_type: 'code',
access_type: 'offline',
})
const authQuery = new URLSearchParams(params)
const authURL = `${this.esiaHost}/aas/oauth2/ac`
return `${authURL}?${authQuery}`
}
private async signParams(params: Record<string, string>) {
const time = moment().format('YYYY.MM.DD HH:mm:ss ZZ')
const state = uuid()
const clientId = this.clientId
const scope = this.scope
const { data: { result: clientSecret } } = await axios.post<{ result: string }>(
`${this.cryptoProServiceAddress}/cryptopro/sign`,
{ text: [scope, time, clientId, state].join('') },
)
return {
...params,
timestamp: time,
client_id: clientId,
scope,
state,
client_secret: clientSecret.replace(/\n/g, ''),
}
}
async getTokens(code: string) {
try {
const params = await this.signParams({
grant_type: 'authorization_code',
token_type: 'Bearer',
redirect_uri: 'no',
code,
})
const authURL = `${this.esiaHost}/aas/oauth2/te`
const authQuery = new URLSearchParams(params)
const { data: tokens } = await axios.post(`${authURL}?${authQuery}`)
return {
idToken: tokens.id_token,
accessToken: tokens.access_token,
refreshToken: tokens.refresh_token,
}
} catch (e) {
const status = e.response ? e.response.status : 500
const message = e.response ? e.response.data.error_description : e.message
throw new HttpException('Failed to get auth tokens: ' + message, status)
}
}
getUserIdFromToken(idToken: string) {
const decodedIdToken = verify(idToken, this.esiaPublicKey, {
algorithms: ['RS256'],
audience: this.clientId,
}) as EsiaParsedToken
return decodedIdToken['urn:esia:sbj']['urn:esia:sbj:oid']
}
async getUserInfo(tokens: EsiaTokens) {
const { idToken, accessToken } = tokens
const oId = this.getUserIdFromToken(idToken)
const [{ data: mainInfo }, { data: contactsInfo }] = await Promise.all([
axios.get(`${this.esiaHost}/rs/prns/${oId}`, {
headers: {
Authorization: `Bearer ${accessToken}`,
},
}),
axios.get(`${this.esiaHost}/rs/prns/${oId}/ctts?embed=(elements)`, {
headers: {
Authorization: `Bearer ${accessToken}`,
},
}),
])
const email = contactsInfo.elements.find(({ type }: { type: string }) => type === 'EML')
return {
id: oId,
firstName: mainInfo.firstName,
lastName: mainInfo.lastName,
surName: mainInfo.middleName,
trusted: mainInfo.trusted,
email: email ? {
value: email.value.toLowerCase(),
verified: email.vrfStu === 'VERIFIED',
} : null,
}
}
}
Надеюсь, статья оказалась для вас полезной. Желаю, чтобы у вас все получилось без особых проблем!
Полезные материалы по теме
Авторизация на портале Госуслуг с помощью Рутокен ЭЦП

- На портале Госуслуг для проведения ЭП используется специальный браузерный плагин, который достаточно универсален. В качестве средств ЭП он умеет “подцеплять” как аппаратные СКЗИ, так и программные криптопровайдеры.
Рутокен ЭЦП в этом плагине поддерживается.
- Поддерживается Рутокен ЭЦП через нашу библиотеку, реализующую стандарт PKCS#11.
- Процедура входа в личной кабинет на портале Госуслуг по ЭП представляет собой подпись случайных данных, отправляемых сервером. Подпись формируется в формате PKCS#7. Для аутентификации пользователя сервер использует информацию из сертификата X.509, а успешная проверка подписи подтверждает наличие у пользователя закрытого ключа, соответствующего сертификату.
- Для того чтобы сервер принял пользовательский сертификат, тот должен быть усиленным квалифицированным.
Задача разбилась на подзадачи:
- Сгенерировать ключ на Рутокен ЭЦП в формате, совместимом с форматом плагина Госуслуг, то есть через библиотеку PKCS#11
- Узнать, какие аккредитованные УЦ выдают квалифицированные сертификаты для физлиц
- Договориться с одним из этих УЦ, что он выдаст сертификат на основе запроса, сделанного удаленно.
- Сформировать правильный запрос на квалифицированный сертификат.
- Транспортировать запрос в УЦ.
- Получить сертификат и записать его на Рутокен ЭЦП в формате, совместимом с форматом плагина Госуслуг, то есть через библиотеку PKCS#11.
С УЦ мы договорились довольно быстро. Один из основных наших партнеров, УЦ СКБ Контур, аккредитован в системе Госуслуг и согласился выдать нам сертификат по описанной схеме.
Для решения технических вопросов мы решили использовать Рутокен Плагин
, который также работает через библиотеку PKCS#11 и совместим с плагином Госуслуг.
Центр регистрации
Для генерации ключа, создания запроса и записи сертификата мы сделали набор web-страниц, который условно назвали Центр регистрации. Этот Центр регистрации не требует серверной части, все операции осуществляются на клиенте. Для работы Центра регистрации требуется установка Рутокен Плагин.
Центр регистрации позволяет:
- Просматривать ключевые пары и сертификаты на подключенных устройствах Рутокен ЭЦП (под просмотром ключевых пар понимается просмотр информации о них)
- Генерировать новую ключевую пару
- Формировать запрос в формате PKCS#10 для выбранной ключевой пары
- Формировать запросы по шаблону
- Импортировать сертификат на устройство
- Удалять сертификат с устройства
Генерация ключа и формирование запроса на сертификат
Ниже приведена инструкция по генерации ключа и формированию запроса на сертификат c помощью Центра регистрации:
1. Запустить Центр регистрации:

2. Подключить Рутокен ЭЦП к компьютеру, выбрать токен, ввести PIN-код:

После выбора токена отобразится меню:

3. Нажать кнопку “Создать ключ”:

Затем нажать «Создать запрос на этом ключе»

4. На странице создания запроса выбрать шаблон “СКБ Контур, для физлиц”, заполнить поля запроса, нажать кнопку “Создать запрос” (все поля должны быть заполнены, в данном случае реализован тестовый пример):

5. Скопировать запрос для отправки его в УЦ:

6. Сгенерированный ключ появился в списке:

После отправки запроса сотруднику пришло уведомление о необходимости явиться в офис УЦ для подтверждения личности.
После прохождения проверки наш сотрудник получил сертификат.
Импорт сертификата
1. Выбрать в списке токен, нажать кнопку “Импортировать сертификат”, полученный сертификат вставить в форму ввода, нажать кнопку “Импортировать”:

2. При импорте выбрать тип сертификата “Пользовательский”:

3. После этого появится окно с отображением сертификата и сообщением об успешном импорте на Рутокен ЭЦП (на картинке приведен пример импорта тестового сертификата, полученного в тестовом УЦ):

4. Сертификат отобразится в списке:

Вход на портал Госуслуг

Выбираем “По электронной подписи”:



Попадаем в личный кабинет:

Вместо заключения
Концепция аппаратных СКЗИ, выполненных в различных форм-факторах, может быть востребована в массовых проектах, ориентированных на физлиц. В первую очередь за счет упрощения использования криптографии. Плагины, осуществляющие интеграцию браузера и аппаратных криптографических решений должны развиваться в сторону увеличения легкости установки и расширения возможностей. Тогда эти решения будут чаще и больше использовать.
Для того, чтоб была возможность выдачи квалифицированных сертификатов на Рутокен ЭЦП, которые можно было бы использовать с плагином Госуслуг или с Рутокен Плагин, сделана локальная версия Центра регистрации, ее можно использовать непосредственно в точках выдачи сертификатов.
Но если в вашем профиле Госуслуг выключен способ входа по электронной подписи (по умолчанию он выключен), то при попытке зайти в ЛК госуслуг вы увидите сообщение:
Вход по электронной подписи отключён
Чтобы включить вход в Госуслуги по ЭП нужно:
- Войти на портал Госуслуг
по логину и паролю
.
Если у вас добавлены организация или ИП на госуслугах, то войти нужно как частное лицо - Войти в «Профиль»
- Открыть раздел « Настройки и безопасность
» - Выбрать вкладку « Безопасность
» - Найти « Вход по электронной подписи
» и включить его - Подтвердить активацию функции паролем от профиля Госуслуг и нажать « Включить
»
Кликайте на изображения что посмотреть процесс включения входа по электронной подписи на скриншотах



Включение входа на госуслуги по ЭП
обновлено: 24 июля, 2023
автором:

50 ответов