-
Notifications
You must be signed in to change notification settings - Fork 42
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Взаимодействие с федеральными сервисами. Формирование jwt токена с использованием GOST3410. #49
Comments
Здравствуйте! Я могу ошибаться, но мне кажется, что проблема в формате сообщения, которое подписывается и отправляется (переменная Чтобы убедиться, что на вашей стороне все ОК, попробуйте проверить свою подпись на своей же стороне, как это сделано в тесте. Или с помощью иного иструмента. |
Спасибо огромное за ответ! Проверка проходит. Попробовал сделать message следующим образом, передать в него вместо string сертификата, List сертификатов, т.е. Вместо: Теперь передаю: Токен генерится, обращаюсь к внешней системе, получаю:
В документации (от внешней системы) имеется
Т.е. остается вопрос, как убрать из нее данные сертификата;. Воспользовался другой библиотекой (но сразу оговорюсь, она на Net6, и на данный момент нам не подходит), но попробовал на ней.
При данном подходе, токен отработал и Успешно осуществился вызов API внешнего сервиса! И как раз тут имеется: Просьба, вопрос, получится ли добавить к библиотеке GostCryptography т.е. чтоб можно было бы вызвать аналогично: Огромная просьба, пожалуйста, сообщите, реально ли, получится ли это сделать? |
Метод удаления сертификата Я пока не вливал ветку, т.к. у меня сейчас нет возможности протестировать данную функциональность. Если у вас есть возможность, переключитесь на ветку |
Скачал исходники. Собрал, подключил напрямую библиотеку, но не запустился. Следующая ошибка:
|
Спасибо. Попробуйте обновиться на последний коммит в ветке |
Спасибо огромное! Всё заработало! |
Отлично! Выпустил версию 2.0.10. В рамках версии добавлены два метода:
|
#49 Add needed security attributes Add unit test for SignedCms.RemoveCertificates() v2.0.10
День добрый!
Используем Вашу библиотеку, наверное единственное что удалось найти на просторах интернета для подписи с использованием сертификата GOST 3410 в среде Windows. Задача: осуществить взаимодействие с фед. сервисами.
В описании указано:
В итоге получаем при любом раскладе ошибку "GW-059: Неверное значение закодированной формы токена".
Более детальной информации, к сожалению не удается узнать, что не так в формируемом токене.
Окружение:
За основу взят пример https://github.com/AlexMAS/GostCryptography/blob/master/Source/GostCryptography.Tests/Pkcs/SignedCmsSignTest.cs
Исходный код (для облегчение и сокращения кода, часть кода убрана, суть остается):
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using GostCryptography.Base;
using GostCryptography.Gost_R3410;
var certStore = new X509Store(StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
var collection = certStore.Certificates;
var searchRes = collection.Find(X509FindType.FindBySerialNumber, serialNumber, false);
var cert = searchRes[0];
var alg = string.Empty;
switch (cert.PublicKey.Oid.Value)
{
case "1.2.643.2.2.19":
alg = "GOST3410-2001";
break;
case "1.2.643.7.1.1.1.1":
alg = "ECGOST3410-2012";
break;
case "1.2.643.7.1.1.1.2":
alg = "ECGOST3410-2012";
break;
}
JwtHeader header = new JwtHeader()
{
{ "alg", alg },
{ "x5c", Convert.ToBase64String(cert.GetRawCertData()) },
};
JwtPayload payload = new JwtPayload()
{
{ "sub", "CD28DB17-8A5E-4DDC-8C0B-0F6C10C9B041" }, /* произвольный гуид */
{ "aud", "http://ya.ru" }, /* произвольный адрес */
{ "iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds() },
{ "exp", DateTimeOffset.UtcNow.Add(new TimeSpan(0, 10, 0)).ToUnixTimeSeconds() }
};
JwtSecurityToken token = new JwtSecurityToken(header, payload);
string message = token.EncodedHeader + "." + token.EncodedPayload;
// Создание объекта для подписи сообщения
ContentInfo contentInfo = new ContentInfo(Encoding.UTF8.GetBytes(message));
GostCryptography.Pkcs.GostSignedCms signedCms = new GostCryptography.Pkcs.GostSignedCms(contentInfo);
// Создание объект с информацией о подписчике
CmsSigner cmsSigner = new CmsSigner(cert);
// Включение информации только о конечном сертификате (только для теста)
cmsSigner.IncludeOption = X509IncludeOption.EndCertOnly;
// Создание подписи для сообщения CMS/PKCS#7
signedCms.ComputeSignature(cmsSigner);
// Создание сообщения CMS/PKCS#7
byte[] signature = signedCms.Encode();
var encodedSignature = Microsoft.IdentityModel.Tokens.Base64UrlEncoder.Encode(signature);
var jwtToken = $"{message}.{encodedSignature}";
/* в итоге получаем токен из трех составляющих
token.EncodedHeader + "." + token.EncodedPayload + "." + encodedSignature */
И при обращении, при любом раскладе получаем ошибку:
"GW-059: Неверное значение закодированной формы токена".
Что конкретно не так в токене, выяснить не удается.
В описании имеется фраза: "и убрать из нее данные сертификата;" - пробовали делать signedCms.Certificates.Clear(); перед вызовом signedCms.Encode();, не помогает.
Не можем понять что может быть. Может у нас что-то не так недонастроено, или какой-то строки кода не хватает.
Или всё же пытаться выяснять что не так в формате.
Подскажите пожалуйста, что может быть, по какому пути идти ?
The text was updated successfully, but these errors were encountered: