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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline PeterPan  
#1 Оставлено : 11 августа 2020 г. 13:37:50(UTC)
PeterPan

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

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

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

Задача проверить подпись маркера доступа ЕСИА.

Документация говорит:

Цитата:
....
Части маркера разделены точкой, так что он имеет вид: HEADER.PAYLOAD.SIGNATURE
Маркер передается в виде строки в формате Base64url64
....

....
в настоящее время в ЕСИА поддерживается алгоритм электронной подписи ГОСТ Р 34.10-2012 (соответствует значению “GOST3410_2012_512”).
....

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


Реализую проверку по пункту №2 так:

Цитата:
byte[] messageBytes = Encoding.UTF8.GetBytes(Base64UrlEncoder.Decode(message.Split(new[] { '.'})[0]) +"."+ Base64UrlEncoder.Decode(message.Split(new[] { '.' })[1]));
byte[] signatureBytes = Base64UrlEncoder.DecodeBytes(signature);

var content = new ContentInfo(messageBytes);
var signedCms = new SignedCms(content, true);

signedCms.Decode(signatureBytes); // здесь получаю ошибку "ASN1 bad tag value met."
signedCms.CheckSignature(certificates, true);



token.txt (1kb) загружен 28 раз(а).

прикреплен пример токена в текстовом виде.

Пробовал также через csptest утилиту, тоже ничего не вышло.

Capture.PNG (25kb) загружен 31 раз(а).

Коллеги, что делаю не так?








Offline Андрей *  
#2 Оставлено : 11 августа 2020 г. 13:47:44(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Здравствуйте.

Там не CMS, а RAW подпись (само значение).
Нужно использовать низкоуровневый интерфейс работы с CSP (передавать значение подписи\открытый ключ).


Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#3 Оставлено : 11 августа 2020 г. 13:49:32(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Создание подписи:
Цитата:

csptest -keys -cont "HDIMAGE\\Контейнер" -sign GOST12_256 -keytype exchange -in файл.ext -out файл.ext.rawsign


Проверка подписи:
Цитата:

csptest -keys -verify GOST12_256 -in файл.ext -signature файл.ext.rawsign -cert raw.cer

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#4 Оставлено : 11 августа 2020 г. 13:51:25(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
В КриптоПРО.NET SDK смотреть

C:\Program Files (x86)\Crypto Pro\.NET SDK\Examples\simple.zip\Sign\cs\
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#5 Оставлено : 11 августа 2020 г. 13:54:39(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Можете прислать пример токена и сертификат (в ЛС)?
Техническую поддержку оказываем тут
Наша база знаний
Offline PeterPan  
#6 Оставлено : 12 августа 2020 г. 5:40:23(UTC)
PeterPan

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 1 постах
Автор: Андрей * Перейти к цитате
Можете прислать пример токена и сертификат (в ЛС)?


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

Ссылка на сервтификат https://esia.gosuslugi.ru/public/esia.zip имя ГОСТ ТЕСИА 2012.cer
Токен я прикреплял выше.

Я пробовал так ранее

Цитата:

private static bool VerifyRawSignString(string message, string signature, X509Certificate2Collection certificates)
{
byte[] messageBytes = Encoding.UTF8.GetBytes(Base64UrlEncoder.Decode(message.Split(new[] { '.' })[0]) + "." + Base64UrlEncoder.Decode(message.Split(new[] { '.' })[1]));
byte[] signatureBytes = Base64UrlEncoder.DecodeBytes(signature);

Gost3411_2012_256CryptoServiceProvider GostHash = new Gost3411_2012_256CryptoServiceProvider();
var csp = (Gost3410_2012_256CryptoServiceProvider)certificates[0].PublicKey.Key;
var res = csp.VerifyData(messageBytes, GostHash, signatureBytes);
return res;
}


Возвращает false.


Offline Андрей *  
#7 Оставлено : 12 августа 2020 г. 11:16:20(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Цитата:
2. Третья часть маркера доступа представляет собой подпись в кодировке UTF-8 от значений первых двух частей маркера доступа (HEADER.PAYLOAD).


Варианты:

1. HEADER.PAYLOAD - как 2 строки через точку:
Цитата:

{"ver":1,"typ":"JWT","sbt":"access","alg":"GOST3410_2012_256"}.{"текст из PAYLOAD"}



2. HEADER.PAYLOAD - как 2 строки из токена, т.е. base64

Цитата:




Открываю https://jwt.io/
справа написано, как пример:

(
base64UrlEncode(header) + "." +
base64UrlEncode(payload)
)


т.е. вычисляется от значений (base64.base64) => и проверять тоже нужно также
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#8 Оставлено : 12 августа 2020 г. 11:38:36(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Автор: PeterPan Перейти к цитате
Автор: Андрей * Перейти к цитате
Можете прислать пример токена и сертификат (в ЛС)?


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

Ссылка на сервтификат https://esia.gosuslugi.ru/public/esia.zip имя ГОСТ ТЕСИА 2012.cer
Токен я прикреплял выше.

Я пробовал так ранее

Цитата:

private static bool VerifyRawSignString(string message, string signature, X509Certificate2Collection certificates)
{
byte[] messageBytes = Encoding.UTF8.GetBytes(Base64UrlEncoder.Decode(message.Split(new[] { '.' })[0]) + "." + Base64UrlEncoder.Decode(message.Split(new[] { '.' })[1]));
byte[] signatureBytes = Base64UrlEncoder.DecodeBytes(signature);

Gost3411_2012_256CryptoServiceProvider GostHash = new Gost3411_2012_256CryptoServiceProvider();
var csp = (Gost3410_2012_256CryptoServiceProvider)certificates[0].PublicKey.Key;
var res = csp.VerifyData(messageBytes, GostHash, signatureBytes);
return res;
}


Возвращает false.




signatureBytes - переверните байты и подпись будет проходить проверку

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#9 Оставлено : 12 августа 2020 г. 11:53:41(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2208 раз в 1723 постах
Ваш токен прошёл проверку


В архиве - перевернутая подпись.

TestESIA.zip (3kb) загружен 27 раз(а).

token.txt.extracted - HEADER.PAYLOAD (две строки в base64 с точкой, как разделитель)
token.txt.extracted.sign.raw.reverse.all - перевернутая подпись
Техническую поддержку оказываем тут
Наша база знаний
thanks 3 пользователей поблагодарили Андрей * за этот пост.
PeterPan оставлено 12.08.2020(UTC), lab2 оставлено 12.08.2020(UTC), ITSec_NSK оставлено 19.07.2022(UTC)
Offline PeterPan  
#10 Оставлено : 12 августа 2020 г. 13:15:03(UTC)
PeterPan

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 1 постах
Огромное спасибо за наводку!

Делюсь работающим кодом.

Цитата:

/// <summary>
/// Проверка подписи JWT в формате HEADER.PAYLOAD.SIGNATURE.
/// </summary>
/// <param name="message">HEADER.PAYLOAD в формате Base64url</param>
/// <param name="signature">SIGNATURE в формате Base64url</param>
/// <param name="certificates">Сертификаты для проверки</param>
/// <returns></returns>
private static bool VerifyRawSignString(string message, string signature, X509Certificate2Collection certificates)
{
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
byte[] signatureBytes = Base64UrlEncoder.DecodeBytes(signature);
Array.Reverse(signatureBytes, 0, signatureBytes.Length);

using (Gost3411_2012_256CryptoServiceProvider GostHash = new Gost3411_2012_256CryptoServiceProvider())
{
var csp = (Gost3410_2012_256CryptoServiceProvider)certificates[0].PublicKey.Key;
return csp.VerifyData(messageBytes, GostHash, signatureBytes);
}
}
thanks 2 пользователей поблагодарили PeterPan за этот пост.
lab2 оставлено 12.08.2020(UTC), two_oceans оставлено 13.08.2020(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (3)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.