Git Product home page Git Product logo

Comments (7)

AlexMAS avatar AlexMAS commented on June 11, 2024 1

Спасибо. Попробуйте обновиться на последний коммит в ветке remove-certs-from-signedcms и повторить попытку.

from gostcryptography.

AlekseyDev avatar AlekseyDev commented on June 11, 2024 1

Спасибо огромное! Всё заработало!

from gostcryptography.

AlexMAS avatar AlexMAS commented on June 11, 2024 1

Отлично!

Выпустил версию 2.0.10.

В рамках версии добавлены два метода:

  • GostSignedCms.RemoveCertificate(X509Certificate2 certificate)
  • GostSignedCms.RemoveCertificates()

from gostcryptography.

AlexMAS avatar AlexMAS commented on June 11, 2024

Здравствуйте!

Я могу ошибаться, но мне кажется, что проблема в формате сообщения, которое подписывается и отправляется (переменная message). Попробуйте посмотреть рабочие примеры интеграции, если доступны. Или запросить описание причин ошибки у вызваемой стороны.

Чтобы убедиться, что на вашей стороне все ОК, попробуйте проверить свою подпись на своей же стороне, как это сделано в тесте. Или с помощью иного иструмента.

from gostcryptography.

AlekseyDev avatar AlekseyDev commented on June 11, 2024

Спасибо огромное за ответ!

Проверка проходит.

Попробовал сделать message следующим образом, передать в него вместо string сертификата, List сертификатов, т.е.

Вместо:
JwtHeader header = new JwtHeader()
{
{ "alg", alg },
{ "x5c", Convert.ToBase64String(cert.GetRawCertData()) },
};

Теперь передаю:
var arr = new List<string>();
arr.Add(Convert.ToBase64String(cert.GetRawCertData()));'
JwtHeader header = new JwtHeader()
{
{ "alg", alg },
{ "x5c", arr },
};

Токен генерится, обращаюсь к внешней системе, получаю:

400 Request Header Or Cookie Too Large

В документации (от внешней системы) имеется

Подпись токена (signature) должна быть сформирована в формате pkcs#7.
При этом для подписи необходимо оставить только блок SignerInfo
и убрать из нее данные сертификата;

Т.е. остается вопрос, как убрать из нее данные сертификата;.

Воспользовался другой библиотекой (но сразу оговорюсь, она на Net6, и на данный момент нам не подходит), но попробовал на ней.
Библиотека: LibCore (https://github.com/CryptoPro/libcore)

using LibCore.Security.Cryptography.X509Certificates;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;

LibCore.Initializer.Initialize();
var certificate = GetCertificate(serialNumber);

var arr = new List<string>();
arr.Add(Convert.ToBase64String(certificate.GetRawCertData()));
JwtHeader header = new JwtHeader()
{
{ "alg", "ECGOST3410-2012" },
{ "x5c", arr }
};

JwtPayload payload = new JwtPayload()
{
{ "sub", "конкретный_гуид" },
{ "aud", "http адрес" },
{ "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;

var contentInfo = new ContentInfo(Encoding.UTF8.GetBytes(message));
var signedCms = new SignedCms(contentInfo, true);
CmsSigner cmsSigner = new CmsSigner(certificate)
{
IncludeOption = X509IncludeOption.EndCertOnly,
};

signedCms.ComputeSignature(cmsSigner);
signedCms.RemoveCertificate(certificate);
var signature = signedCms.Encode();

var encodedSignature = Microsoft.IdentityModel.Tokens.Base64UrlEncoder.Encode(signature);
var jwtToken = $"{message}.{encodedSignature}";

При данном подходе, токен отработал и Успешно осуществился вызов API внешнего сервиса!
Но, повторюсь, данная библиотека нам не подходит.

И как раз тут имеется:
signedCms.RemoveCertificate(certificate);

Просьба, вопрос, получится ли добавить к библиотеке GostCryptography
К классу: GostCryptography.Pkcs.GostSignedCms
метод RemoveCertificate(certificate);

т.е. чтоб можно было бы вызвать аналогично:
signedCms.RemoveCertificate(certificate);

Огромная просьба, пожалуйста, сообщите, реально ли, получится ли это сделать?

from gostcryptography.

AlexMAS avatar AlexMAS commented on June 11, 2024

Метод удаления сертификата SignedCms.RemoveCertificate() имеется только в .NET/.NET Core, но отсутствует в .NET Framework. В последних версиях реализация многих классов переработана так, что многие операции осущетсвляются самим .NET в managed-коде, в то время, как .NET Framework в большинстве своем использует Windows Crypto API. Насколько я понимаю, в этом причина, по которой аналогичная функциональность отсутствует в .NET Framework. В Windows Crypto API сертификат можно удалить только по его индексу в структуре сообщения. Чтобы в будущем не ломать обратную совместимость я добавил метод GostSignedCms.RemoveCertificates(). Эту операцию можно реализовать как в старом .NET Framework, так и в новом. Данный метод удалят из сообщения все сертификаты.

Я пока не вливал ветку, т.к. у меня сейчас нет возможности протестировать данную функциональность. Если у вас есть возможность, переключитесь на ветку remove-certs-from-signedcms и попробуйте повторить эксперимент. Дадите обратную связь, вольем изменения/выпустим новую версию или попробуем доработать метод. ;)

from gostcryptography.

AlekseyDev avatar AlekseyDev commented on June 11, 2024

Скачал исходники. Собрал, подключил напрямую библиотеку, но не запустился.

Следующая ошибка:

Attempt by method 'GostCryptography.Reflection.SignedCmsHelper.RemoveCertificates(System.Security.Cryptography.Pkcs.SignedCms)' to access method 'GostCryptography.Reflection.SignedCmsHelper.GetMessageHandle(System.Security.Cryptography.Pkcs.SignedCms)' failed.

from gostcryptography.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.