Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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 и оперировать функциями из них?
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,192 Сказал(а) «Спасибо»: 100 раз Поблагодарили: 272 раз в 253 постах
|
а какая подпись все же нужна? сырая или cms? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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 этап, сертификат предоставлен клиентом, интеграция в работе
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,192 Сказал(а) «Спасибо»: 100 раз Поблагодарили: 272 раз в 253 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 08.11.2024(UTC) Сообщений: 5
|
Закрытого ключа нет, предоставлен только сертификат, сертификата не достаточно?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 08.11.2024(UTC) Сообщений: 5
|
а что подразумевается под закрытым ключом? Он должен располагаться где то рядом с сертификатам в отдельном каталоге (хранилище ключей)? Отредактировано пользователем 26 ноября 2024 г. 15:10:56(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close