Статус: Сотрудник
Группы: Участники
Зарегистрирован: 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 структуру. |
|
1 пользователь поблагодарил Артём Макаров за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 07.07.2024(UTC) Сообщений: 8 Откуда: Глубокое Сказал(а) «Спасибо»: 2 раз
|
Спасибо, вчера нашёл пример и сделал, но уже не стал писать, т к было поздно
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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 бит
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 14.10.2011(UTC) Сообщений: 143 Поблагодарили: 31 раз в 30 постах
|
|
|
1 пользователь поблагодарил Георгий Садофьев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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 ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 14.10.2011(UTC) Сообщений: 143 Поблагодарили: 31 раз в 30 постах
|
Нет, не можете.
Что касается библиотеки libcore, то она поддеживает .NET 6.0 и .NET 8.0. |
|
1 пользователь поблагодарил Георгий Садофьев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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; }
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,297 Сказал «Спасибо»: 549 раз Поблагодарили: 2201 раз в 1717 постах
|
Автор: SergeyZhuravel Автор: Георгий Садофьев подскажите пожалуйста, сделал все как в примере указано, но возникает ошибка Цитата:System.Security.Cryptography.CryptographicException: 'Ошибка исполнения функции.'
на этапе выполнения в коде Цитата:signedXml.ComputeSignature(); Истекла демо-лицензия? Ошибка исполнения функции (0x8007065B) |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 26.09.2024(UTC) Сообщений: 4 Откуда: Химки Сказал(а) «Спасибо»: 4 раз
|
Автор: Андрей * Автор: SergeyZhuravel Автор: Георгий Садофьев подскажите пожалуйста, сделал все как в примере указано, но возникает ошибка Цитата:System.Security.Cryptography.CryptographicException: 'Ошибка исполнения функции.'
на этапе выполнения в коде Цитата:signedXml.ComputeSignature(); Истекла демо-лицензия? Ошибка исполнения функции (0x8007065B) Спасибо, большое за ответ, да все верно, лицензия не была введена! Но после ввода лицензии если проверяю под отладкой выполнение Цитата:signedXml.ComputeSignature(); - возникает всплывающее окно "Аутентификация - Крипто Про CSP" с запросом пароля на контейнер - в всплывающем окне Считыватель: Registry, Носитель: уникальное имя отсутствует, Контейнер: номер контейнера, поле для ввода пароля от контейнера и кнопка сохранить. Подскажите, это нужно (задать пароль от контейнера) при выполнении подписания сделать в коде? Если да, то каким методом или как с этим быть? Если при выполнении службы это будет возникать, то это остановит ее выполнение. Отредактировано пользователем 29 сентября 2024 г. 18:55:39(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,182 Сказал(а) «Спасибо»: 99 раз Поблагодарили: 271 раз в 252 постах
|
Автор: SergeyZhuravel возникает всплывающее окно "Аутентификация - Крипто Про CSP" с запросом пароля на контейнер тут все просто. выберите что-то одно. лучше первый вариант 1) удаляете пароль на контейнере 2) запоминаете пароль через галочку от нужного пользователя 3) передаете пароль через SecureString Отредактировано пользователем 1 октября 2024 г. 14:40:01(UTC)
| Причина: Не указана |
|
1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close