<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум Рутокен &mdash; Подпись строки при помощи сертификата и флешки с Рутокен 3.0 ЭЦП на C#]]></title>
	<link rel="self" href="https://forum.rutoken.ru/feed/atom/topic/4535/" />
	<updated>2024-12-19T13:48:53Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.rutoken.ru/topic/4535/</id>
		<entry>
			<title type="html"><![CDATA[Re: Подпись строки при помощи сертификата и флешки с Рутокен 3.0 ЭЦП на C#]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/26758/#p26758" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Евгений Мироненко пишет:</cite><blockquote><p>Добрый день!</p><p>Вас не затруднит предоставить следующие данные?</p><p>1. Подписываемые данные<br />2. Значение подписи, принимаемое сторонней системой<br />3. Значение подписи, получаемое в результате выполнения вашего кода на C#.</p><p>Обычно мы в таких случаях смотрим на структуру PKCS7-сообщений с помощью ASN.1-парсера (например, <a href="https://lapo.it/asn1js/),">https://lapo.it/asn1js/),</a> сопоставляем элементы структуры с RFC5652 (<a href="https://datatracker.ietf.org/doc/html/rfc5652">https://datatracker.ietf.org/doc/html/rfc5652</a>) и сравниваем в принимаемой и отклоняемой подписи:<br />* используемые алгоритмы хеширования и подписи,<br />* значения хеша от данных,<br />* состав подписанных атрибутов -- <br />и, таким образом, выявляем различия. Как минимум, часть различий может быть устранима правильным применением функции PKCS7Sign.</p></blockquote></div><p>Евгений, приветствую!</p><p>Выяснилось, что проблема была в другом параметре, а не в самом алгоритме поиска. В любом случае, премного благодарим Вас за помощь!</p>]]></content>
			<author>
				<name><![CDATA[aleksandrbahmatov]]></name>
				<uri>https://forum.rutoken.ru/user/16156/</uri>
			</author>
			<updated>2024-12-19T13:48:53Z</updated>
			<id>https://forum.rutoken.ru/post/26758/#p26758</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подпись строки при помощи сертификата и флешки с Рутокен 3.0 ЭЦП на C#]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/26755/#p26755" />
			<content type="html"><![CDATA[<p>Добрый день!</p><p>Вас не затруднит предоставить следующие данные?</p><p>1. Подписываемые данные<br />2. Значение подписи, принимаемое сторонней системой<br />3. Значение подписи, получаемое в результате выполнения вашего кода на C#.</p><p>Обычно мы в таких случаях смотрим на структуру PKCS7-сообщений с помощью ASN.1-парсера (например, <a href="https://lapo.it/asn1js/),">https://lapo.it/asn1js/),</a> сопоставляем элементы структуры с RFC5652 (<a href="https://datatracker.ietf.org/doc/html/rfc5652">https://datatracker.ietf.org/doc/html/rfc5652</a>) и сравниваем в принимаемой и отклоняемой подписи:<br />* используемые алгоритмы хеширования и подписи,<br />* значения хеша от данных,<br />* состав подписанных атрибутов -- <br />и, таким образом, выявляем различия. Как минимум, часть различий может быть устранима правильным применением функции PKCS7Sign.</p>]]></content>
			<author>
				<name><![CDATA[Евгений Мироненко]]></name>
				<uri>https://forum.rutoken.ru/user/8673/</uri>
			</author>
			<updated>2024-12-19T11:51:32Z</updated>
			<id>https://forum.rutoken.ru/post/26755/#p26755</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подпись строки при помощи сертификата и флешки с Рутокен 3.0 ЭЦП на C#]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/26738/#p26738" />
			<content type="html"><![CDATA[<p>Евгений, приветствую!</p><p>Ваш пример очень сильно помог в разработке, действительно удалось подключить библиотеки и подписать текст сертификатом с флешки.<br />Но при выполнении кода мы столкнулись с другим моментом, мешающим нам полноценно использовать полученную подпись.</p><p>Подпись не принимает сторонняя система, с которой мы интегрируемся, причём, строка, подписанная в форме на сайте <a href="https://ra.rutoken.ru/devices/signature">https://ra.rutoken.ru/devices/signature</a>, принимается&nbsp; (после удаления переноса строк).</p><p>Код формирования подписи представлен ниже:<br />&nbsp; &nbsp;<br /></p><div class="codebox"><pre><code>private const uint PKCS7_DETACHED_SIGNATURE = 0x01;

private const string RutokenEcpDllDefaultPath = &quot;rtpkcs11ecp.dll&quot;;

public static byte[]? Sign(byte[] array, string pin)
{
    // Шаблон для поиска закрытого ключа ГОСТ Р 34.10-2012 (256 бит).
    var privateKeyAttributes = new List&lt;ObjectAttribute&gt;
        {
            // Объект закрытого ключа.
            new(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY),
            // Закрытый ключ является объектом токена.
            new(CKA.CKA_TOKEN, true),
        };

    // Шаблон для поиска сертификата ключа подписи.
    var certificateAttributes = new List&lt;ObjectAttribute&gt;
        {
            // Объект сертификата.
            new(CKA.CKA_CLASS, CKO.CKO_CERTIFICATE),
            // Сертификат является объектом токена.
            new(CKA.CKA_TOKEN, true),
            // Тип сертификата - X.509
            new(CKA.CKA_CERTIFICATE_TYPE, CKC.CKC_X_509),
        };

    // Инициализировать библиотеку.
    Console.WriteLine(&quot;Library initialization.&quot;);
    using var pkcs11 = new Pkcs11(RutokenEcpDllDefaultPath, AppType.MultiThreaded);

    // Получить доступный слот.
    Console.WriteLine(&quot;Checking tokens available.&quot;);
    var slot = Helpers.GetUsableSlot(pkcs11);

    // Открыть RW сессию в первом доступном слоте.
    Console.WriteLine(&quot;Opening RW session.&quot;);
    using var session = slot.OpenSession(SessionType.ReadWrite);

    // Выполнить аутентификацию Пользователя.
    Console.WriteLine(&quot;User authentication.&quot;);
    session.Login(CKU.CKU_USER, pin);

    try
    {
        // Формирование подписи.
        Console.WriteLine(&quot;Signing...&quot;);

        // Поиск закрытого ключа на токене.
        Console.WriteLine(&quot; Getting private key...&quot;);
        var privateKeys = session.FindAllObjects(privateKeyAttributes);

        // Поиск сертификата на токене.
        Console.WriteLine(&quot; Getting certificate...&quot;);
        var certificates = session.FindAllObjects(certificateAttributes);

        // Подпись данных.
        var signature = session.PKCS7Sign(array,
            certificates[0], privateKeys[0], null, PKCS7_DETACHED_SIGNATURE);
        return signature;
    }
    finally
    {
        // Сбросить права доступа как в случае исключения,
        // так и в случае успеха.
        // Сессия закрывается автоматически.
        session.Logout();
    }
} </code></pre></div><p>В результате выполнения метода<br /></p><div class="codebox"><pre><code>var accessTokenAsBytes = Encoding.UTF8.GetBytes(accessToken);
var signatureAsBytes = Sign(accessTokenAsBytes, pin);</code></pre></div><p>мы получаем base64-строку с подписью, подпись декодируется через КриптоПро CSP.<br />Мы предполагаем, что проблема с исходными данными или кодированием в byte[] для session.PKCS7Sign().</p><p>Прошу Вас подсказать, если есть такая возможность, как вызывать метод PKCS7Sign() таким образом, чтобы результат подписи получался такой же, как при вызове формы на сайте.</p>]]></content>
			<author>
				<name><![CDATA[aleksandrbahmatov]]></name>
				<uri>https://forum.rutoken.ru/user/16156/</uri>
			</author>
			<updated>2024-12-18T16:40:01Z</updated>
			<id>https://forum.rutoken.ru/post/26738/#p26738</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подпись строки при помощи сертификата и флешки с Рутокен 3.0 ЭЦП на C#]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/26720/#p26720" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Евгений Мироненко пишет:</cite><blockquote><p>Добрый день!<br />В репозитории компании на github есть нужные вам примеры: <a href="https://github.com/AktivCo/RutokenPkcs11Interop.Samples/blob/master/src/PKIExtensions.SignPKCS7-GOST34.10-2012-256/SignPKCS7-GOST34.10-2012-256.cs">https://github.com/AktivCo/RutokenPkcs1 … 012-256.cs</a></p></blockquote></div><p>Уважаемый Евгений, огромное спасибо за ссылку и информацию! Обязательно изучу и попробую применить.<br />С уважением,<br />Александр</p>]]></content>
			<author>
				<name><![CDATA[aleksandrbahmatov]]></name>
				<uri>https://forum.rutoken.ru/user/16156/</uri>
			</author>
			<updated>2024-12-18T01:02:07Z</updated>
			<id>https://forum.rutoken.ru/post/26720/#p26720</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Подпись строки при помощи сертификата и флешки с Рутокен 3.0 ЭЦП на C#]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/26719/#p26719" />
			<content type="html"><![CDATA[<p>Добрый день!<br />В репозитории компании на github есть нужные вам примеры: <a href="https://github.com/AktivCo/RutokenPkcs11Interop.Samples/blob/master/src/PKIExtensions.SignPKCS7-GOST34.10-2012-256/SignPKCS7-GOST34.10-2012-256.cs">https://github.com/AktivCo/RutokenPkcs1 … 012-256.cs</a></p>]]></content>
			<author>
				<name><![CDATA[Евгений Мироненко]]></name>
				<uri>https://forum.rutoken.ru/user/8673/</uri>
			</author>
			<updated>2024-12-18T00:58:52Z</updated>
			<id>https://forum.rutoken.ru/post/26719/#p26719</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Подпись строки при помощи сертификата и флешки с Рутокен 3.0 ЭЦП на C#]]></title>
			<link rel="alternate" href="https://forum.rutoken.ru/post/26718/#p26718" />
			<content type="html"><![CDATA[<p>Приветствую всех!<br />Стоит задача подписать строку аналогично тому, как реализовано в онлайн-инструменте РуТокен по подписанию через плагин в браузере (оно точно подписывает верно, мы проверяли в ручном режиме, взяв имеющийся сертификат, флешку с Рутокен 3.0 ЭЦП и подписав строку). Имеется сертификат и флешка Рутокен 3.0 ЭЦП. Пытаюсь разобраться, как воспользоваться (и возможно ли оно в принципе) SDK RuToken, чтобы подписать PKCS.7 входящую строку в коде на C# (версия .NET-фреймворка 8). Либо, возможно, есть альтернативные пути.<br />Заранее благодарю за ответы.<br />С уважением,<br />Александр.</p>]]></content>
			<author>
				<name><![CDATA[aleksandrbahmatov]]></name>
				<uri>https://forum.rutoken.ru/user/16156/</uri>
			</author>
			<updated>2024-12-17T15:44:00Z</updated>
			<id>https://forum.rutoken.ru/post/26718/#p26718</id>
		</entry>
</feed>
