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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline dsalodki.test  
#1 Оставлено : 9 июля 2024 г. 20:27:09(UTC)
dsalodki.test

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

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

Сказал(а) «Спасибо»: 2 раз
Как через c# подписать pdf файл?
Получаю сертификат из хранилища в реестре, потом приватный ключ. Подписываю и проверяю в c# коде. Потом массив байтов сохраняю в sig файл. Но при валидации инструментом криптоПро пишет код ошибки 13. Подписать через инструмент криптоПро получилось и провалидировать. Но смущает что там другой алгоритм ГОСТ и есть разные расширения, а не просто массив байт.
Подскажите как получить правильно подписанный sig файл из c#?
Offline Андрей *  
#2 Оставлено : 9 июля 2024 г. 21:00:25(UTC)
Андрей *

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

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

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Здравствуйте.

Смотрите примеры в SDK к КриптоПРО.NET
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#3 Оставлено : 9 июля 2024 г. 21:01:39(UTC)
Андрей *

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

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

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline dsalodki.test  
#4 Оставлено : 9 июля 2024 г. 21:35:10(UTC)
dsalodki.test

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

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

Сказал(а) «Спасибо»: 2 раз
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);

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

X509Certificate2 c = certificates.First();

//var pKey = c.GetGost3410_2012_256PublicKey();

//var pKey = c.GetGost3410_2012_256PrivateKey();

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

ContentInfo contentInfo = new ContentInfo(pdfBytes);

// Создаем объект SignedCms по только что созданному
// объекту ContentInfo.
// SubjectIdentifierType установлен по умолчанию в
// IssuerAndSerialNumber.
// Свойство Detached устанавливаем явно в true, таким
// образом сообщение будет отделено от подписи.
SignedCms signedCms = new SignedCms(contentInfo, true);

// Определяем подписывающего, объектом CmsSigner.
CmsSigner cmsSigner = new CmsSigner(c);

// Подписываем CMS/PKCS #7 сообение.
Console.Write("Вычисляем подпись сообщения для субъекта " +
"{0} ... ", c.SubjectName.Name);
signedCms.ComputeSignature(cmsSigner);
Console.WriteLine("Успешно.");

// Кодируем CMS/PKCS #7 подпись сообщения.
var sign = signedCms.Encode();
File.WriteAllBytes(GetFullPath("Files\\report.pdf.sig"), sign);

на строке signedCms.ComputeSignature(cmsSigner);

System.Security.Cryptography.CryptographicException: 'Could not determine signature algorithm for the signer certificate.'

удалял старые версии КриптоПро.NET и устанавливал заново, не помогло


при обращении к c.PrivateKey
System.NotSupportedException: 'The certificate key algorithm is not supported.'

Отредактировано пользователем 9 июля 2024 г. 21:37:44(UTC)  | Причина: Не указана

Offline Андрей *  
#5 Оставлено : 9 июля 2024 г. 21:40:48(UTC)
Андрей *

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

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

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Какие версии продуктов полностью?
КриптоПро.NET, КриптоПро CSP, ОС.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#6 Оставлено : 9 июля 2024 г. 21:44:08(UTC)
Андрей *

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

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

Сказал «Спасибо»: 550 раз
Поблагодарили: 2212 раз в 1727 постах
Пуск\..\КРИПТО-ПРО\Сертификаты\

В личном хранилище - у этого сертификата на вкладке Состав - какие алгоритмы отображаются?



Алгоритм подписи: ГОСТ Р 34.11-2012/34.10-2012 256 бит
Алгоритм хеширования: ГОСТ Р 34.11-2012 256 бит
...
Открытый ключ: ГОСТ Р 34.10-2012 256 бит (512 bits)
...
?
Техническую поддержку оказываем тут
Наша база знаний
Offline dsalodki.test  
#7 Оставлено : 9 июля 2024 г. 21:46:23(UTC)
dsalodki.test

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

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

Сказал(а) «Спасибо»: 2 раз
CyptoPro CSP 5.0.13000 KC1
CryptoPro.Net.Security 2024.6.27
CryptoPro.Security.Cryptography 2024.6.27
CryptoPro.Security.Cryptography.Pkcs 2024.6.27
CryptoPro.Security.Cryptography.Xml 2024.6.27
LibCore.Windows 2024.1.10.1
КриптоПро .NET 2.0.8948.0 от 01.07.2024
КриптоПро .NET SDK 2.0.8948.0

Windows 11 23H2 OS Build 22631.3737

про сертификат
Signature algorithm
GOST R 34.11-2012/34.10-2012 256 bit
Signature hash algorithm
GOST R 34.11-2012 256 bit
Public key
GOST R 34.10-2012 256 bit (512 Bits)

Отредактировано пользователем 9 июля 2024 г. 21:49:42(UTC)  | Причина: Не указана

Offline dsalodki.test  
#8 Оставлено : 9 июля 2024 г. 21:58:20(UTC)
dsalodki.test

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

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

Сказал(а) «Спасибо»: 2 раз
переписал код

using LibCore.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;

namespace CerKey
{
internal class Program
{
static void Main(string[] args)
{
var pwd = "YtCeqCdj2701!98$";

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);

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

X509Certificate2 c = certificates.First();

//var pKey = c.GetGost3410_2012_256PublicKey();

//var pKey = c.GetGost3410_2012_256PrivateKey();

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


Gost3410_2012_256 privateKey = c.PrivateKey as Gost3410_2012_256;

byte[] msg = File.ReadAllBytes("../../../data.txt");

bool detached = true;
ContentInfo contentInfo = new ContentInfo(msg);
SignedCms signedCms = new SignedCms(contentInfo, detached);
CmsSigner cmsSigner = new CmsSigner(SubjectIdentifierType.Unknown, c, privateKey);

cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));

cmsSigner.IncludeOption = X509IncludeOption.WholeChain;
signedCms.ComputeSignature(cmsSigner);
byte[] sign = signedCms.Encode();
File.WriteAllBytes("../../../core_sign.sig", sign);

//byte[] sign = pKey.SignData(pdfBytes);

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

}

private static string GetFullPath(string relativePath)
{
return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, relativePath);
}
}
}



но System.NotSupportedException: 'The certificate key algorithm is not supported.'
здесь Gost3410_2012_256 privateKey = c.PrivateKey as Gost3410_2012_256;
Offline dsalodki.test  
#9 Оставлено : 9 июля 2024 г. 22:46:11(UTC)
dsalodki.test

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

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

Сказал(а) «Спасибо»: 2 раз
если пишу так
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].

Отредактировано пользователем 9 июля 2024 г. 22:48:04(UTC)  | Причина: Не указана

Offline Артём Макаров  
#10 Оставлено : 10 июля 2024 г. 9:23:56(UTC)
Артём Макаров

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

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

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 63 раз в 59 постах
Автор: dsalodki.test Перейти к цитате
переписал код

using LibCore.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;

namespace CerKey
{
internal class Program
{
static void Main(string[] args)
{
var pwd = "YtCeqCdj2701!98$";

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);

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

X509Certificate2 c = certificates.First();

//var pKey = c.GetGost3410_2012_256PublicKey();

//var pKey = c.GetGost3410_2012_256PrivateKey();

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


Gost3410_2012_256 privateKey = c.PrivateKey as Gost3410_2012_256;

byte[] msg = File.ReadAllBytes("../../../data.txt");

bool detached = true;
ContentInfo contentInfo = new ContentInfo(msg);
SignedCms signedCms = new SignedCms(contentInfo, detached);
CmsSigner cmsSigner = new CmsSigner(SubjectIdentifierType.Unknown, c, privateKey);

cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));

cmsSigner.IncludeOption = X509IncludeOption.WholeChain;
signedCms.ComputeSignature(cmsSigner);
byte[] sign = signedCms.Encode();
File.WriteAllBytes("../../../core_sign.sig", sign);

//byte[] sign = pKey.SignData(pdfBytes);

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

}

private static string GetFullPath(string relativePath)
{
return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, relativePath);
}
}
}



но System.NotSupportedException: 'The certificate key algorithm is not supported.'
здесь Gost3410_2012_256 privateKey = c.PrivateKey as Gost3410_2012_256;


Добрый день.

Вы используете версию с установкой исправлений, которая в будущем не будет поддерживаться.

Если это осознанное решение - не вижу у вас инициализации библиотеки. В релизе есть файл [Readme.md], а именно раздел "Установка и инициализация библиотеки".

Рекомендую перейти на актуальный [релиз]. Как минимум нужно будет заменить
* `SignedCms` -> `CpSignedCms`
* `X509Certificate2` -> `CpX509Certificate2`
* `X509Certificate2Collection` -> `CpX509Certificate2Collection`
* `SignerInfo` -> `CpSignerInfo`

Устанавливать КриптоПро .NET 2.0 для работы через данную библиотеку не обязательно.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.