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

Уведомление

Icon
Error

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

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

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

Сказал(а) «Спасибо»: 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) загружен 9 раз(а).

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

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

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

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








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

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

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

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

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


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

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Создание подписи:
Цитата:

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)
Сообщений: 9,737
Мужчина
Российская Федерация

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
В КриптоПРО.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)
Сообщений: 9,737
Мужчина
Российская Федерация

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

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

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

Сказал(а) «Спасибо»: 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)
Сообщений: 9,737
Мужчина
Российская Федерация

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Цитата:
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)
Сообщений: 9,737
Мужчина
Российская Федерация

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Автор: 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)
Сообщений: 9,737
Мужчина
Российская Федерация

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


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

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

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

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

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

Сказал(а) «Спасибо»: 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)
Offline Koblyakov.slava  
#11 Оставлено : 24 августа 2020 г. 17:37:36(UTC)
Koblyakov.slava

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

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

Сказал(а) «Спасибо»: 1 раз
Доброго дня.

Автор: Андрей * Перейти к цитате
В КриптоПРО.NET SDK смотреть

C:\Program Files (x86)\Crypto Pro\.NET SDK\Examples\simple.zip\Sign\cs\


Каким образом получить эти Examples?
Интересует в контексте java.

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

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Автор: Koblyakov.slava Перейти к цитате
Доброго дня.

Автор: Андрей * Перейти к цитате
В КриптоПРО.NET SDK смотреть

C:\Program Files (x86)\Crypto Pro\.NET SDK\Examples\simple.zip\Sign\cs\


Каким образом получить эти Examples?
Интересует в контексте java.



samples-source.jar есть в составе дистрибутива JCP/JavaCSP
Техническую поддержку оказываем тут
Наша база знаний
Offline Koblyakov.slava  
#13 Оставлено : 25 августа 2020 г. 11:18:30(UTC)
Koblyakov.slava

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате

samples-source.jar есть в составе дистрибутива JCP/JavaCSP


Доброго дня. Можно приложить ссылку на этот дистрибутив.
И ещё вопрос по документации на фреймворк jcp. Она есть?

Я скачивал архив, jcp-2.0.40132-A но там нет ни примеров ни документации

Offline Koblyakov.slava  
#14 Оставлено : 28 августа 2020 г. 8:32:55(UTC)
Koblyakov.slava

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
Ваш токен прошёл проверку



Доброго дня.
Такая же история с проверкой маркера доступа от ЕСИА но, даже через эту утилиту, которая в ссылке указана, подпись маркера не проходит проверку.
Подпись запросов реализована через утилиту cryptcp.exe, от Есиа приходит токен, который проходит валидацию в самой ЕСИА, но подпись ни программно ни через сторонний софт не проверить.

Есть ли возможность проверить этот токен через ту же утилиту cryptcp.exe?

Bezymjannyjj.png (43kb) загружен 6 раз(а).

Отредактировано пользователем 28 августа 2020 г. 9:00:09(UTC)  | Причина: Не указана

Offline Андрей *  
#15 Оставлено : 28 августа 2020 г. 10:00:06(UTC)
Андрей *

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

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

Сказал «Спасибо»: 357 раз
Поблагодарили: 1406 раз в 1084 постах
Автор: Koblyakov.slava Перейти к цитате
Автор: Андрей * Перейти к цитате
Ваш токен прошёл проверку



Доброго дня.
Такая же история с проверкой маркера доступа от ЕСИА но, даже через эту утилиту, которая в ссылке указана, подпись маркера не проходит проверку.
Подпись запросов реализована через утилиту cryptcp.exe, от Есиа приходит токен, который проходит валидацию в самой ЕСИА, но подпись ни программно ни через сторонний софт не проверить.

Есть ли возможность проверить этот токен через ту же утилиту cryptcp.exe?

Bezymjannyjj.png (43kb) загружен 6 раз(а).



Почитайте про jwt, там RAW подпись, +кодирование, а не cms, которую делает cryptcp


RAW подпись можно сделать через crypthashdata, CryptSignHash или через... Вызовы утилит, csptest

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