Подпись данных

Добрый день. Подскажите, можно ли подписать данные (например XML) сертификатом ГОСТ на ключе ЕГАИС используя библиотеку PKCS#11 без использования КриптоПро?

Re: Подпись данных

Добрый день, Алексей39.
Да, можно например нашем центром сертификации.

Re: Подпись данных

Федосов Никита пишет:

Добрый день, Алексей39.
Да, можно например нашем центром сертификации.

Супер, отличная ссылка, не знал о таком функционале. Но меня больше интересовало могу ли я это делать самостоятельно из кода на C#. Я скачал примеры RutokenPkcs11Interop.Samples и не могу понять каким из примеров я должен воспользоваться, все которые я пробовал заканчиваются на ошибке:                          List<ObjectHandle> privateKeys = session.FindAllObjects(RsaPrivateKeyAttributes);
Errors.Check("No private keys found", privateKeys.Count > 0);

Re: Подпись данных

Алексей39, добрый день.
Вам необходимо использовать примеры, в названии которых есть GOST34.10-2012-256
Если на токене только ГОСТ ключи, то вот эта строчка FindAllObjects(RsaPrivateKeyAttributes) вернет ошибку. Так как ищет RSA ключ.
Так же в шаблоне поиска ключа необходимо проверить, что там нет жестко указанных ID ключей. Иначе ваши ключи так же не будут найдены.

Re: Подпись данных

Нашел, разобрался, подписал. Спасибо! Подскажите еще саму малость, метод session.FindAllObjects(...) возвращает массив сертификатов (ГОСТ и RSA), каким атрибутом я могу ограничить что бы возвращал только ГОСТ? И подскажите как можно обратиться для чтения к полям сертификата, например прочитать поле "CN" или только можно получить всю информацию в текстовом виде session.GetCertificateInfoText(cert)?

Re: Подпись данных

Алексей39, добрый день.
1. Для поиска ключей ГОСТ попробуйте в шаблон поиска ключей и сертификатов добавить вот такой атрибут:
// Тип ключа - ГОСТ Р 34.10-2012(256)
new ObjectAttribute(CKA.CKA_KEY_TYPE, (uint) Extended_CKK.CKK_GOSTR3410),
2. у нас подобного функционала не реализовано. Либо использовать существующую функцию получения информации о сертификате. Либо попробовать написать что-то свое.

Re: Подпись данных

Добрый день.
Атрибут CKK_GOSTR3410 почему-то не помогает, перепробовал все варианты, вообще перестает находить сертификаты. В самом сертификате ГОСТ Signature Algorithm: GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit), в целом не страшно исходя из второго ответа придется по тексту пробежаться, от туда достану.

Можно еще поинтересоваться в продолжении топика https://forum.rutoken.ru/topic/3665/, вроде как токен может подписывать в формате CAdES BES, не могу найти примера.

Re: Подпись данных

Можете показать шаблон поиска ключа? Такой атрибут, как написал, используется в примере на удаление ключа и там он работает.

Для C# есть только пример на CMS(pkcs7) подпись: https://github.com/AktivCo/RutokenPkcs1 … 0-2012-256

Re: Подпись данных

new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_CERTIFICATE),
new ObjectAttribute(CKA.CKA_TOKEN, true),
new ObjectAttribute(CKA.CKA_PRIVATE, false),
new ObjectAttribute(CKA.CKA_CERTIFICATE_TYPE, CKC.CKC_X_509),

new ObjectAttribute(CKA.CKA_KEY_TYPE, (uint) Extended_CKK.CKK_GOSTR3410)

Использую из примера: PKIExtensions.GetCertificateInfo-GOST34.10-2012-256

Re: Подпись данных

Нет, найти сертификат с таким атрибутом не получится.
Если необходимо найти именно ГОСТ сертификат, то необходимо найти ГОСТ ключ по шаблону с таким атрибутом.
Взять из этого ключа CKA_ID и потом уже искать сертификат с нужным CKA_ID.

Re: Подпись данных

Ну помогите еще немного. В документации разработчика сказано что "Чтобы сформировать CAdES-BES подпись, опциям addEssCert и addSignTime требуется присвоить значение true." Метод Sing на Java из примера https://aktivco.github.io/rutoken-plugin-demo/ действительно получает последним параметром опции: plugin.pluginObject.sign(ui.device(), ui.certificate(), ui.getContent(this.container), dataFormat, options). Проблема в том что на C# методы Sign и PKCS7Sign таких опций не получают.

Re: Подпись данных

C помощью "обертки" pkcs11 для C# так не получится сделать.
Можете взять "сырую" подпись методом Sign, а CAdES-BES конверт собрать с помощью https://www.bouncycastle.org/csharp/

Re: Подпись данных

Понял. Спасибо за консультации.