Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline foke  
#1 Оставлено : 31 мая 2022 г. 22:02:42(UTC)
foke

Статус: Новичок

Группы: Участники
Зарегистрирован: 31.05.2022(UTC)
Сообщений: 1

Здравствуйте.
В версии ЕСИА 2.90 депрекейтнули эндпоинт для получения кода авторизации /aas/oauth2/ac. Новая версия: /aas/oauth2/v2/ac.

Изменилось описание формирования параметра client_secret.

До версии 2.90:
Цитата:
<client_secret> – подпись запроса в формате PKCS#7 detached signature в кодировке UTF-
8 от значений четырех параметров HTTP–запроса: scope, timestamp, clientId, state (без
разделителей). <client_secret> должен быть закодирован в формате base64 url safe


Версия 2.90:
Цитата:
<client_secret> - подпись значений пяти параметров в кодировке UTF-8:
client_id, scope, timestamp, state, redirect_uri.
конкатенировать вышеуказанные параметры;
подписать полученную строку с использованием алгоритма подписания data hash с
использованием механизмов КриптоПРО CSP и сертификата информационной
системы;
закодировать полученное значение в URL Safe Base64.


В версии <2.90 с "подпись запроса в формате PKCS#7 detached signature" разобрались, работает.

В версии 2.90 неясно, что такое "подписать полученную строку с использованием алгоритма подписания data hash с использованием механизмов КриптоПРО CSP"?
Формулировка весьма расплывчатая, на мой взгляд.
Должен ли измениться код формирования подписи?
"data hash" - это название алгоритма?
Есть ли рабочий java-код под эту задачу?


Использование прежнего java-кода формирования подписи параметра client_secret (с учётом прочих обновлений параметров, описанных в инструкции) приводит к ошибке "ESIA-007005: The client is not authorized to request an access token using this method.", что по моему опыту соответствует некорректно сформированному client_secret.

На данный момент сгенерированный url получения кода авторизации выглядит следующим образом:
Цитата:
https://esia-portal1.test.gosuslugi.ru/aas/oauth2/v2/ac
?client_id=MY-SYSTEM
&client_certificate_hash=последовательность-64-символа
&scope=fullname%20gender%20birthdate%20birthplace%20birth_cert_doc%20contacts%20inn%20snils%20residence_doc%20temporary_residence_doc%20id_doc%20temporary_residence_doc
&response_type=code
&access_type=offline
&client_secret=последовательность-4-тысячи-символов
&state=265133f8-0aaf-4c7a-89e2-b50fc6e0318a
&timestamp=2022.05.31+23%3A10%3A39+%2B0400
&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Flogin%2Foauth2%2Fcode%2Fesia

Отредактировано пользователем 31 мая 2022 г. 22:15:29(UTC)  | Причина: Не указана

Offline saaremaa  
#2 Оставлено : 6 июля 2022 г. 13:50:13(UTC)
saaremaa

Статус: Новичок

Группы: Участники
Зарегистрирован: 06.07.2022(UTC)
Сообщений: 6
Российская Федерация

У вас получилось что-нибудь с получением кода авторизации? Тоже зависли на этом моменте и не знаем куда двигаться. Поддержка Минцифры только пересылает отрывки из методички.


Дополнение от 07.07.2022:

Цитата:

К Вашему запросу SCR#2946679 добавлен комментарий:

Добрый день!

По Вашему обращению сообщаем, что при формировании client_secret необходимо использовать следующие алгоритмы шифрования:
GOST3411_2012_256withGOST3410_2012_256;
GOST3411_2012_512withGOST3410_2012_512:
GOST3411withGOST3410EL .

Кто добавил: СКУФ Служебный/ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО "РОСТЕЛЕКОМ"


после формирования подписи с помощью GOST3411_2012_256withGOST3410_2012_256 получили корректный client_secret

Библиотеки на языке Golang: https://github.com/Theo730/gogost
Описание: http://www.gogost.cypherpunks.ru/

Отредактировано пользователем 7 июля 2022 г. 13:01:22(UTC)  | Причина: Не указана

Offline two_oceans  
#3 Оставлено : 8 июля 2022 г. 8:06:58(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 394 раз в 366 постах
Автор: saaremaa Перейти к цитате
По Вашему обращению сообщаем, что при формировании client_secret необходимо использовать следующие алгоритмы шифрования:
GOST3411_2012_256withGOST3410_2012_256;
GOST3411_2012_512withGOST3410_2012_512:
GOST3411withGOST3410EL .
Добрый день. Сначала конечно замечание, что не шифрования, а подписания, так как в сообщениях выше процитированы места, где ясно говорится "подпись", "подписать".
1) Если перевести идентификаторы на человекопонятный язык, то это ГОСТ-2012 (256 и 512 бит), ГОСТ-2001. Насчет актуальности последнего весьма сомнительно, так как сертификаты гост-2001 уже должны были все закончиться. Для вышеуказанных идентификаторов нужно на подписание передавать сами данные, а не вычисленный заранее хэш.
2) Если речь про PKCS#7, то там нет проблемы с порядком байтов, все определено в стандарте. Если же речь про RawSignature, то стандарт не определяет порядок байт, может понадобится "переворачивать/отзеркалить" значение хэша и/или подписи (первый байт с последним, второй с предпоследним и т.д) до кодирования BASE64, так как указанные идентификаторы без слова "CryptoPro", что подразумевает порядок байт Big Endian. Обычно достаточно перевернуть значение подписи. В то же время есть идентификаторы гост-2012 со словом "CryptoPro", которые подразумевает порядок байт Little Endian - то есть переворотов не нужно.
3) Важно также не забывать, что URL Safe Base64 не то же самое, что BASE64, нужно заменить ряд символов, имеющих специальное значение в URL.

Что же до указанной ссылки на библиотеку Го, похоже на несертифицированное решение с самостоятельной реализацией криптографических примитивов. Для тестов с тестовыми ключами конечно никто Вам ничего особо не скажет. Используя же несертифицированное решение с гитхаба в продакшене с "боевыми" ключами, Вы принимаете на себя риски возможных штрафов за неправильное обращение со СКЗИ и ключевой информацией. Будьте бдительны, не все работающие решения можно использовать по закону.
Offline forumname  
#4 Оставлено : 23 августа 2022 г. 9:44:46(UTC)
forumname

Статус: Новичок

Группы: Участники
Зарегистрирован: 23.08.2022(UTC)
Сообщений: 1

Автор: foke Перейти к цитате
подписать полученную строку с использованием алгоритма подписания data hash с использованием механизмов КриптоПРО CSP


Я правильно понимаю, что сначала вычисляем hash с помощью алгоритма GOST3411_2012_256, а потом подписываем вычисленное значение алгоритмом GOST3410_2012_256?

Или нужно как-то иначе использовать механизмы КриптоПро CSP?
Offline navrocky  
#5 Оставлено : 19 октября 2022 г. 13:52:15(UTC)
navrocky

Статус: Участник

Группы: Участники
Зарегистрирован: 19.10.2022(UTC)
Сообщений: 14
Российская Федерация

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 2 раз в 2 постах
Вот рабочий код на Java для формирования client_secret с использованием крипто-провайдера BouncyCastle:

Код:
PrivateKey privateKey = ...;
String joinedString = String.join("", clientId, scope, timeStamp, state, redirectUri);
Signature signer = Signature.getInstance("GOST3411WITHECGOST3410-2012-256", new BouncyCastleProvider());
signer.initSign(privateKey);
signer.update(joinedString.getBytes());
signature = signer.sign();
String clientSecret = Base64.getUrlEncoder().encodeToString(signature);

Отредактировано пользователем 19 октября 2022 г. 13:53:54(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил navrocky за этот пост.
JsutUser оставлено 11.11.2022(UTC)
Offline EugeneNSK  
#6 Оставлено : 19 декабря 2022 г. 11:26:02(UTC)
EugeneNSK

Статус: Участник

Группы: Участники
Зарегистрирован: 25.11.2020(UTC)
Сообщений: 14
Российская Федерация
Откуда: NSK

Сказал(а) «Спасибо»: 3 раз
Автор: navrocky Перейти к цитате
Вот рабочий код на Java для формирования client_secret с использованием крипто-провайдера BouncyCastle:

Код:
PrivateKey privateKey = ...;
String joinedString = String.join("", clientId, scope, timeStamp, state, redirectUri);
Signature signer = Signature.getInstance("GOST3411WITHECGOST3410-2012-256", new BouncyCastleProvider());
signer.initSign(privateKey);
signer.update(joinedString.getBytes());
signature = signer.sign();
String clientSecret = Base64.getUrlEncoder().encodeToString(signature);


Тоже столкнулся с проблемой формирования client_secret при получении кода доступа (через v2/ac).
Подпись действительно стала сырой.
Приведенный выше код рабочий.

Для JCP/JCSP использую:
Код:
String joinedString = String.join("", clientId, scope, timeStamp, state, redirectUri);
AlgorithmDetails algorithmDetails = new AlgorithmDetails(privateKey.getAlgorithm());
Signature signature = Signature.getInstance(algorithmDetails.getSignAlgorithm(), provider);
signature.initSign(privateKey);
signature.update(joinedString.getBytes());
byte[] result = signature.sign();
String clientSecret = new String(Base64.getUrlEncoder().encode(result), StandardCharsets.UTF_8);

Offline dzibzeev  
#7 Оставлено : 29 марта 2023 г. 17:25:28(UTC)
dzibzeev

Статус: Новичок

Группы: Участники
Зарегистрирован: 28.03.2023(UTC)
Сообщений: 1
Российская Федерация

Коллеги!

А у кого-нибудь получилось с использованием cryptcp -signf подписать секрет клиента для второй версии API(v2/ac) ЕСИА?

Вот так мы сейчас создаем подпись для ЕСИА(код на go):

command := exec.Command(s.cmd, "-signf",
"-der",
"-strict",
"-cert",
"-hashalg", s.hashAlgOID,
"-detached",
"-thumbprint", s.thumbprint,
"-pin", s.containerPIN,
filename)


С первой версией все прекрасно работает, с v2 не хочет работать. ЕСИА возвращает ошибку ESIA-007053: OAuthErrorEnum.clientSecretWrong

Offline MESHOK  
#8 Оставлено : 21 июня 2023 г. 12:25:31(UTC)
MESHOK

Статус: Новичок

Группы: Участники
Зарегистрирован: 21.06.2023(UTC)
Сообщений: 1
Российская Федерация

Поблагодарили: 1 раз в 1 постах
Находите имя своего ключа: csptest -keys -enum_cont -verifycontext -fqcn
Подписываете строку: csptest -keys -cont '\\.\<хранилище>\<имя _контейнера>' -sign GOST12_256 -in файл_с_данными -out файл_с_данными.sig -keytype exchange
Прочитываете файл в бинарном виде и побайтово его переворачиваете. Например:
Исходные данные: 68 65 6c 6c 6f
Перевернутые данные: 6f 6c 6c 65 68
Перевернутые данные кодируете в base64url - это и есть client_secret
thanks 1 пользователь поблагодарил MESHOK за этот пост.
EgorKenk оставлено 29.11.2023(UTC)
Offline saaremaa  
#9 Оставлено : 4 сентября 2023 г. 20:40:58(UTC)
saaremaa

Статус: Новичок

Группы: Участники
Зарегистрирован: 06.07.2022(UTC)
Сообщений: 6
Российская Федерация

Коллеги, поделитесь решением. Как подписать через КриптоПро строку client_secret для получения авторизационного кода через https://esia-portal1.tes...lugi.ru/aas/oauth2/v2/ac ???

По возможности примерами к командной строке. Если есть кусок кода на Golang - это просто будет чудесно.

Все что выше перепробовали - получаем ошибку ESIA-007053.

При этом самописное решение работает, но использовать его нельзя в боевой системе.
Offline Андрей *  
#10 Оставлено : 4 сентября 2023 г. 21:44:08(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2054 раз в 1594 постах
Автор: saaremaa Перейти к цитате
Коллеги, поделитесь решением. Как подписать через КриптоПро строку client_secret для получения авторизационного кода через https://esia-portal1.tes...lugi.ru/aas/oauth2/v2/ac ???

По возможности примерами к командной строке. Если есть кусок кода на Golang - это просто будет чудесно.

Все что выше перепробовали - получаем ошибку ESIA-007053.

При этом самописное решение работает, но использовать его нельзя в боевой системе.


а этот ответ с примером команды уже проверили?
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.