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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Strat0s  
#1 Оставлено : 11 ноября 2024 г. 9:37:28(UTC)
Strat0s

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

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

Добрый день!


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

Цитата:

1. Осуществление с помощью base64 url safe декодирования первых двух частей
маркера. В header указан алгоритм шифрования (параметр «alg»»).
2. Третья часть маркера доступа представляет собой подпись в кодировке UTF-8 от значений первых двух частей маркера доступа (HEADER.PAYLOAD).
Необходимо осуществить проверку данной электронной подписи с использованием сертификата ключа проверки электронной подписи ЕСИА.
3. Проверка времени выдачи, начала и прекращения маркера.
3. Проверка организации, выпустившей маркер, а также адресата маркера.


Возникли проблемы с реализацией 2 пункта. К слову, сертификат так же предоставлен клиентом, интеграция работает корректно, проблем нет.

Текущая версия кода для него имеет вид (проект на java 21):
Цитата:

String[] accessTokenParts = accessToken.getValue().split("\\.");
String certFilePath = "/home/user/cer.cer";
CertificateFactory factory = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) factory.generateCertificate(new FileInputStream(certFilePath));
PublicKey publicKey = certificate.getPublicKey();

String header = accessTokenParts[0];
String payload = accessTokenParts[1];
String signature = accessTokenParts[2];

byte[] signedData = (header + "." + payload).getBytes(StandardCharsets.UTF_8);
byte[] decodedSignature = java.util.Base64.getUrlDecoder().decode(signature);

Signature sig = Signature.getInstance(certificate.getSigAlgName());
sig.initVerify(publicKey);
sig.update(signedData);

if (!sig.verify(decodedSignature))
{
throw new IllegalArgumentException("Invalid access token signature");
}



И при вызове sig.verify(decodedSignature) я всегда получаю false.
Алгоритм заголовка в маркере доступа - GOST_3410_2012_256
Алгоритм в сертификате - GOST-3411-2012-256WITHECGOST-3410-2012-256

При этом нашел более новую версию методических указаний 3.48, где данный этап написан следующим образом:

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

Получается, что теперь в проект мне надо затащить библиотеки КриптоПро CSP?

Отредактировано пользователем 11 ноября 2024 г. 10:18:05(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#2 Оставлено : 11 ноября 2024 г. 19:56:34(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 100 раз
Поблагодарили: 272 раз в 253 постах
Добрый день.

в качестве криптопровайдера:
либо JCP
либо JCSP + CSP

возможно вам нужно перевернуть значение подписи.
например через ArrayUtils.reverse(sign)
в CSP (С) один порядок байт, в C# и Java другой.
читайте про Big-Endian и Little-Endian

маппить алгоритм подписи и алгоритм открытого ключа сертификата лучше через наш AlgorithmUtility

посмотрите пример создания и проверки сырой подписи https://github.com/msham.../service/RawService.java

Отредактировано пользователем 11 ноября 2024 г. 19:59:38(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Strat0s  
#3 Оставлено : 26 ноября 2024 г. 14:20:04(UTC)
Strat0s

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

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

Спасибо за ответ.

Значение подписи уже переворачивал через ArrayUtils.reverse(sign) - не помогло.

Прошу подсказать, какие библиотеки мне нужно затащить в проект?
Нашел здесь https://cryptopro.ru/products/csp/downloads ссылку на архив КриптоПро CSP 5.0 R4 для Java (Java CSP) (КриптоПро Java CSP и JTLS (версия 5.0.46605-A для Java 11 и выше)) - из архива необходимо загрузить jar- архивы в проект - JCP.jar и JCSP.jar и оперировать функциями из них?
Offline Санчир Момолдаев  
#4 Оставлено : 26 ноября 2024 г. 14:39:11(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 100 раз
Поблагодарили: 272 раз в 253 постах
а какая подпись все же нужна?
сырая или cms?
Техническую поддержку оказываем тут
Наша база знаний
Offline Strat0s  
#5 Оставлено : 26 ноября 2024 г. 14:44:39(UTC)
Strat0s

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

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

вот тут не совсем понимаю

перед мной поставили задачу - сделать проверку подписи маркера доступа ЕСИА
согласно документации на сайте МинСвязи - https://digital.gov.ru/ru/documents/6186/
проверка осуществляется так:

Для проверки маркера доступа необходимо выполнить следующие действия:

1.Декодировать заголовок (header) маркера доступа, который закодирован
в base64 url safe.
2.Проверить формат заголовка, а именно:
-заголовок после декодирования из base64 url safe должен иметь кодировку UTF-8;
-значение поля «typ» должно быть «JWT»;
-значение поля «sbt» для маркера доступа должно быть «aссess»;
-значение поля «ver» должно быть одним из поддерживаемых в системе, осуществляющей проверку;
-значение поля «alg» должно быть «GOST3410_2012_256»или «GOST3410_2012_512».
3.С использованием сертифицированного средства криптографической защиты информации выполнить проверку электронной подписи маркера доступа
с использованием сертификата ключа проверки электронной подписи ЕСИА. Алгоритм электронной подписи должен соответствовать значению поля alg
из заголовка маркера доступа.

Не получается реализовать 3 этап, сертификат предоставлен клиентом, интеграция в работе
Offline Санчир Момолдаев  
#6 Оставлено : 26 ноября 2024 г. 14:51:54(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 100 раз
Поблагодарили: 272 раз в 253 постах
судя по документу нужна cms подпись.

посмотрите пример
https://github.com/msham.../service/CmsService.java
попробуйте создать подпись с его помощью. потом проверить в esia

где у вас закрытый ключ будет? от этого зависит что лучше использовать JCP или же JCSP
Техническую поддержку оказываем тут
Наша база знаний
Offline Strat0s  
#7 Оставлено : 26 ноября 2024 г. 14:58:02(UTC)
Strat0s

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

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

Закрытого ключа нет, предоставлен только сертификат, сертификата не достаточно?
Offline Strat0s  
#8 Оставлено : 26 ноября 2024 г. 15:02:12(UTC)
Strat0s

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

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

а что подразумевается под закрытым ключом?
Он должен располагаться где то рядом с сертификатам в отдельном каталоге (хранилище ключей)?

Отредактировано пользователем 26 ноября 2024 г. 15:10:56(UTC)  | Причина: Не указана

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