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

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline Артём Макаров  
#11 Оставлено : 10 июля 2024 г. 9:24:52(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 62 раз в 58 постах
Автор: dsalodki.test Перейти к цитате
если пишу так
CpX509Store store = new CpX509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);

CpX509Certificate2Collection certificates = store.Certificates.Find(X509FindType.FindBySerialNumber, "1200647108d32ff1de1bbe07cf000200647108", false);

CpX509Certificate2 c = certificates.First();

//var pKey = c.GetGost3410_2012_256PublicKey();

var pKey = c.GetGost3410_2012_256PrivateKey();

var pdfBytes = File.ReadAllBytes(GetFullPath("Files\\report.pdf"));

var sign = pKey.SignData(pdfBytes, 0, pdfBytes.Length);

File.WriteAllBytes(GetFullPath("Files\\report.pdf.sig"), sign);

то всё работает, но подпись невалидна

Основная информация
Результат проверки Подпись недействительна
Дополнительная информация Файл подписи имеет неверный формат. Убедитесь, что данные в файле имеют кодировку Base64 (с/без заголовками) или переданы бинарные данные. Ошибка: [Встречено неверное значение тега ASN1]. Код: [0x8009310b].


Тут вы получаете "сырую" подпись просто в виде массива байт, а не CMS подпись, которая имеет определённую asn структуру.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Артём Макаров за этот пост.
Андрей * оставлено 10.07.2024(UTC)
Offline dsalodki.test  
#12 Оставлено : 10 июля 2024 г. 11:20:22(UTC)
dsalodki.test

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

Группы: Участники
Зарегистрирован: 07.07.2024(UTC)
Сообщений: 8
Беларусь
Откуда: Глубокое

Сказал(а) «Спасибо»: 2 раз
Спасибо, вчера нашёл пример и сделал, но уже не стал писать, т к было поздно
Offline SergeyZhuravel  
#13 Оставлено : 27 сентября 2024 г. 9:14:55(UTC)
SergeyZhuravel

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

Группы: Участники
Зарегистрирован: 26.09.2024(UTC)
Сообщений: 4
Российская Федерация
Откуда: Химки

Сказал(а) «Спасибо»: 4 раз
Добрый день. Возникает ошибка на этапе выполнения кода: "The certificate key algorithm is not supported."

Цитата:
X509Store certStore = new X509Store(StoreLocation.LocalMachine);
certStore.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
X509Certificate2Collection certs = certStore.Certificates.Find(X509FindType.FindByThumbprint, LibraryCommon.Helpers.ConfigurationHelper.Configuration.SignatureCertificateThumbprint, false);
X509Certificate2 certificate = certs[0];

XmlDocument document = this.Document;
SignedXml signedXml = new SignedXml(document);
signedXml.SigningKey = сertificate.PrivateKey;


В приведенном примере кода в
Цитата:
signedXml.SigningKey = сertificate.PrivateKey;
возникает ошибка The certificate key algorithm is not supported.
Причем, если запускать в проекте на TargetFramework = net8.0 в данном кусочке кода указанно, что свойство сertificate.PrivateKey устаревшее и его нельзя использовать. А надо использовать методы GetRSAPrivateKey или использовать CopyWithPrivateKey.

Как решить данную проблему?


исходные данные:
проект в котором выполняется код на TargetFramework = netstandard2.1
ОС Windows 10,
на компьютере установлены:
.net 8.0 (MS .NET SDK 8.0.402 x64),
Крипто Про CSP версии 5.0.13000 КС1,
Крипто Про .Net версии 2.0.8973.0
Алгоритм подписи сертификата ГОСТ Р 34.11-2012/34.10-2012 256 бит
Offline Георгий Садофьев  
#14 Оставлено : 27 сентября 2024 г. 9:20:58(UTC)
Георгий Садофьев

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

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

Поблагодарили: 31 раз в 30 постах
Добрый день!

Посмотрите пример из документации.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Георгий Садофьев за этот пост.
SergeyZhuravel оставлено 27.09.2024(UTC)
Offline SergeyZhuravel  
#15 Оставлено : 27 сентября 2024 г. 10:38:54(UTC)
SergeyZhuravel

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

Группы: Участники
Зарегистрирован: 26.09.2024(UTC)
Сообщений: 4
Российская Федерация
Откуда: Химки

Сказал(а) «Спасибо»: 4 раз
Автор: Георгий Садофьев Перейти к цитате
Добрый день!

Посмотрите пример из документации.


Подскажите, в примере указано использование libcore, как я понимаю при использовании в проектах на .net core 3.1. У меня реализация подписания Xml реализована в проекте с на TargetFramework = netstandard2.1. , скопированного с проекта, ранее написанного на .net framework 4.8 (ранее для другой службы был реализован код подписания xml с использованием CryptoPro.Sharpei.Xml на .net framework 4.8, но из-за необходимости применять функционал, которого нет в .net framework 4.8 код был переписан на netstandard2.1.)
Но теперь ошибка The certificate key algorithm is not supported в
Цитата:
SignedXml signedXml = new SignedXml(document);
signedXml.SigningKey = this.Certificate.PrivateKey;

Могу ли я использовать на netstandard2.1. подписание с инструментами Крипто Про .Net версии 2.0.8973.0 ?
Offline Георгий Садофьев  
#16 Оставлено : 27 сентября 2024 г. 10:46:23(UTC)
Георгий Садофьев

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

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

Поблагодарили: 31 раз в 30 постах
Нет, не можете.

Что касается библиотеки libcore, то она поддеживает .NET 6.0 и .NET 8.0.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Георгий Садофьев за этот пост.
SergeyZhuravel оставлено 27.09.2024(UTC)
Offline SergeyZhuravel  
#17 Оставлено : 27 сентября 2024 г. 14:29:49(UTC)
SergeyZhuravel

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

Группы: Участники
Зарегистрирован: 26.09.2024(UTC)
Сообщений: 4
Российская Федерация
Откуда: Химки

Сказал(а) «Спасибо»: 4 раз
Автор: Георгий Садофьев Перейти к цитате
Добрый день!

Посмотрите пример из документации.


подскажите пожалуйста, сделал все как в примере указано, но возникает ошибка
Цитата:
System.Security.Cryptography.CryptographicException: 'Ошибка исполнения функции.'
на этапе выполнения в коде
Цитата:
signedXml.ComputeSignature();


Цитата:
at CryptoPro.Security.Cryptography.CapiHelper.TrySignHash(SafeProvHandle hProv, Int32 keyNumber, Int32 calgKey, Int32 calgHash, ReadOnlySpan`1 hash, Int32 dwFlags, Span`1 signature, Int32& pcbSignature)
at CryptoPro.Security.Cryptography.CspAlgorithm.TrySignHashCore(ReadOnlySpan`1 rgbHash, Int32 hashAlgId, Int32 dwFlags, Span`1 signature, Int32& bytesWritten)
at CryptoPro.Security.Cryptography.Gost3410_2012_256CryptoServiceProvider.TrySignHashCore(ReadOnlySpan`1 rgbHash, Span`1 signature, Int32& bytesWritten)
at CryptoPro.Security.Cryptography.Gost3410Algorithm.SignHashCore(ReadOnlySpan`1 hash)
at CryptoPro.Security.Cryptography.Gost3410Algorithm.SignHash(Byte[] hash)
at CryptoPro.Security.Cryptography.Gost2012_256SignatureFormatter.CreateSignature(Byte[] rgbHash)
at CryptoPro.Security.Cryptography.Xml.CpSignedXml.ComputeSignature()
at LibraryLogicNetCore.SmevSignXml.SignXmlFile(XmlDocument doc, String DigestMethod) in C:\Work\AIM\etp_service\LibraryLogicNetCore\SmevSignXml.cs:line 86



Как исправить данную проблему, чего не хватает? использую проект на .net8.0 , набор установленных nuget пакетов libcore последней версии 2024.8.12.2.

полный текст кода соответствует как в примере libcore для подписания документов:

Цитата:
public static XmlDocument SignXmlFile(XmlDocument doc, string DigestMethod = CpSignedXml.XmlDsigGost3411_2012_256Url)
{

CpX509Certificate2 certificate = null;

using (var store = new CpX509Store(StoreName.My, StoreLocation.CurrentUser))
{
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, "xxxxxxx", false);
certificate = certificates[0];
}


// Создаем объект SignedXml по XML документу.
CpSignedXml signedXml = new CpSignedXml(doc);

AsymmetricAlgorithm Key = certificate.GetGost3410_2012_256PrivateKey();

// Добавляем ключ в SignedXml документ.
signedXml.SigningKey = Key;

// Создаем ссылку на node для подписи.
// При подписи всего документа проставляем "".
CpReference reference = new CpReference();
reference.Uri = "";

// Явно проставляем алгоритм хэширования,
// по умолчанию SHA1.
reference.DigestMethod = DigestMethod;

// Добавляем transform на подписываемые данные
// для удаления вложенной подписи.
CpXmlDsigEnvelopedSignatureTransform env =
new CpXmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);

// Добавляем СМЭВ трансформ.
signedXml.SafeCanonicalizationMethods.Add("urn://smev-gov-ru/xmldsig/transform");
XmlDsigSmevTransform smev =
new XmlDsigSmevTransform();
reference.AddTransform(smev);

// Добавляем transform для канонизации.
CpXmlDsigC14NTransform c14 = new CpXmlDsigC14NTransform();
reference.AddTransform(c14);

// Добавляем ссылку на подписываемые данные
signedXml.AddReference(reference);

// Создаем объект KeyInfo.
CpKeyInfo keyInfo = new CpKeyInfo();

// Добавляем сертификат в KeyInfo
keyInfo.AddClause(new CpKeyInfoX509Data(certificate));

// Добавляем KeyInfo в SignedXml.
signedXml.KeyInfo = keyInfo;

// Можно явно проставить алгоритм подписи: ГОСТ Р 34.10 2012 256
// Если сертификат ключа подписи ГОСТ Р 34.10 2012 256
// и алгоритм ключа подписи не задан, то будет использован
// XmlDsigGost3410_2012_256Url
signedXml.SignedInfo.SignatureMethod =
CpSignedXml.XmlDsigGost3410_2012_256Url;

// Вычисляем подпись.
signedXml.ComputeSignature();

// Получаем XML представление подписи и сохраняем его
// в отдельном node.
XmlElement xmlDigitalSignature = signedXml.GetXml();

// Добавляем node подписи в XML документ.
doc.DocumentElement.AppendChild(doc.ImportNode(
xmlDigitalSignature, true));

// При наличии стартовой XML декларации ее удаляем
// (во избежание повторного сохранения)
if (doc.FirstChild is XmlDeclaration)
{
doc.RemoveChild(doc.FirstChild);
}

return doc;
}

Offline Андрей *  
#18 Оставлено : 27 сентября 2024 г. 15:08:49(UTC)
Андрей *

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

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

Сказал «Спасибо»: 549 раз
Поблагодарили: 2206 раз в 1721 постах
Автор: SergeyZhuravel Перейти к цитате
Автор: Георгий Садофьев Перейти к цитате


подскажите пожалуйста, сделал все как в примере указано, но возникает ошибка
Цитата:
System.Security.Cryptography.CryptographicException: 'Ошибка исполнения функции.'
на этапе выполнения в коде
Цитата:
signedXml.ComputeSignature();





Истекла демо-лицензия?
Ошибка исполнения функции (0x8007065B)
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
SergeyZhuravel оставлено 27.09.2024(UTC)
Offline SergeyZhuravel  
#19 Оставлено : 29 сентября 2024 г. 17:39:47(UTC)
SergeyZhuravel

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

Группы: Участники
Зарегистрирован: 26.09.2024(UTC)
Сообщений: 4
Российская Федерация
Откуда: Химки

Сказал(а) «Спасибо»: 4 раз
Автор: Андрей * Перейти к цитате
Автор: SergeyZhuravel Перейти к цитате
Автор: Георгий Садофьев Перейти к цитате


подскажите пожалуйста, сделал все как в примере указано, но возникает ошибка
Цитата:
System.Security.Cryptography.CryptographicException: 'Ошибка исполнения функции.'
на этапе выполнения в коде
Цитата:
signedXml.ComputeSignature();





Истекла демо-лицензия?
Ошибка исполнения функции (0x8007065B)


Спасибо, большое за ответ, да все верно, лицензия не была введена! Но после ввода лицензии если проверяю под отладкой выполнение
Цитата:
signedXml.ComputeSignature();
- возникает всплывающее окно "Аутентификация - Крипто Про CSP" с запросом пароля на контейнер - в всплывающем окне Считыватель: Registry, Носитель: уникальное имя отсутствует, Контейнер: номер контейнера, поле для ввода пароля от контейнера и кнопка сохранить. Подскажите, это нужно (задать пароль от контейнера) при выполнении подписания сделать в коде? Если да, то каким методом или как с этим быть? Если при выполнении службы это будет возникать, то это остановит ее выполнение.

Отредактировано пользователем 29 сентября 2024 г. 18:55:39(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#20 Оставлено : 1 октября 2024 г. 14:39:24(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 100 раз
Поблагодарили: 272 раз в 253 постах
Автор: SergeyZhuravel Перейти к цитате
возникает всплывающее окно "Аутентификация - Крипто Про CSP" с запросом пароля на контейнер


тут все просто. выберите что-то одно. лучше первый вариант
1) удаляете пароль на контейнере
2) запоминаете пароль через галочку от нужного пользователя
3) передаете пароль через SecureString

Отредактировано пользователем 1 октября 2024 г. 14:40:01(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
SergeyZhuravel оставлено 05.10.2024(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы<12
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.