Comments (7)
Спасибо. Попробуйте обновиться на последний коммит в ветке remove-certs-from-signedcms
и повторить попытку.
from gostcryptography.
Спасибо огромное! Всё заработало!
from gostcryptography.
Отлично!
Выпустил версию 2.0.10.
В рамках версии добавлены два метода:
GostSignedCms.RemoveCertificate(X509Certificate2 certificate)
GostSignedCms.RemoveCertificates()
from gostcryptography.
Здравствуйте!
Я могу ошибаться, но мне кажется, что проблема в формате сообщения, которое подписывается и отправляется (переменная message
). Попробуйте посмотреть рабочие примеры интеграции, если доступны. Или запросить описание причин ошибки у вызваемой стороны.
Чтобы убедиться, что на вашей стороне все ОК, попробуйте проверить свою подпись на своей же стороне, как это сделано в тесте. Или с помощью иного иструмента.
from gostcryptography.
Спасибо огромное за ответ!
Проверка проходит.
Попробовал сделать 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.
Метод удаления сертификата 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.
Скачал исходники. Собрал, подключил напрямую библиотеку, но не запустился.
Следующая ошибка:
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)
- Не проверяется подпись от ПФР (но проверяется онлайн на КриптоПро DSS) HOT 2
- Smev.Verify. Обнаружено неизвестное преобразование. HOT 2
- Верефикация нескольких сигнатур в файле
- Расшифровка с помощью сертификата HOT 2
- Подпись сообщений в веб-приложении (IIS) HOT 5
- Утечки памяти в GostCryptography HOT 4
- .netcore HOT 7
- Ошибка подписания при работе с КриптоПРО
- ЭЛН 2.0 HOT 90
- Реализация под Net 5 HOT 7
- VipNet 4.4.2 создает провайдеры с типом 75, 80 и 81 HOT 1
- Поддержка префиксов в xmldsig
- Верификация подписи ГОСТ Р 34.10-2012, 256 бит. HOT 3
- Принудительное шифрование XML по ГОСТ 2001 HOT 3
- Отправка запроса на получение "Уведомление об изменении ЭЛН".
- ComputeSignature Exception HOT 8
- Создание симметричных ключей для тестов HOT 5
- Алгоритм ключа сертификата не поддерживается HOT 1
- Как расшифровать текст при помощи алгоритма ассиметричного ключа HOT 10
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gostcryptography.