<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Рутокен &mdash; Работа с rutoken. C#]]></title>
		<link>https://forum.rutoken.ru/topic/2507/</link>
		<atom:link href="https://forum.rutoken.ru/feed/rss/topic/2507/" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Работа с rutoken. C#».]]></description>
		<lastBuildDate>Thu, 29 Dec 2016 14:32:18 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Работа с rutoken. C#]]></title>
			<link>https://forum.rutoken.ru/post/10257/#p10257</link>
			<description><![CDATA[<p>Добрый день.<br />Похоже, что ваш код рабочий, но я не вижу где в нем хоть какая-то работа с Рутокен?</p>]]></description>
			<author><![CDATA[null@example.com (Кирилл Мещеряков)]]></author>
			<pubDate>Thu, 29 Dec 2016 14:32:18 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10257/#p10257</guid>
		</item>
		<item>
			<title><![CDATA[Re: Работа с rutoken. C#]]></title>
			<link>https://forum.rutoken.ru/post/10243/#p10243</link>
			<description><![CDATA[<p>Посмотрите пожалуйста на мой кастыль. Посоветуйте, как его улучшить и будет ли он работать правильно?</p><p>У меня работает, результат тестирования :</p><p>С помощью метода &quot;ПредварительнаяПроверкаПередПодписанием&quot;, пользователю предоставляется выбор сертификата, если пользователь не выбирает сертификат, получаем сообщение и возвращаем Null,&nbsp; если выбранный сертификат просроченный, получаем сообщение об этом и возратим null, если сертификат валидный, пробуем найти ключ, если ключа нет, получаем отрицательный результат проверки и метод возвратит null.</p><p>Если сертификат выбранный пользователем не просроченный и вставлен ключевой носитель, то метод вернёт сертификат для дальнейшего подписания с него.</p><p>зы<br />нужно предоставить выбор сертификата из личных сертификатов пользователя и тех, которые присутствуют на ключе, как у меня работает в коде, пока не разобрался, вроде бы выбор сертификатов осуществляется по личным сертификатам пользователя...</p><p>&nbsp; &nbsp; </p><div class="codebox"><pre><code>    /// &lt;summary&gt;
    /// Возвращает валидный сертификат или null если валидный сертификат отсутствует
    /// &lt;/summary&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public X509Certificate2 ПредварительнаяПроверкаПередПодписанием()
    {
        // Находим секретный ключ по сертификату в хранилище MY
        X509Store store = new X509Store(&quot;My&quot;, StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);

        X509Certificate2Collection coll = X509Certificate2UI.SelectFromCollection(store.Certificates, &quot;Выберите сертификат&quot;, &quot;Выберите сертификат&quot;, X509SelectionFlag.SingleSelection);

        if (coll.Count == 0 || coll == null)
        {
            Console.WriteLine(&quot;Ключ не найден.&quot;);
            return null;
        }

        X509Certificate2 certificate = coll[0];

        if (certificate == null /*|| certificate.Verify()*/)
        {
            Console.WriteLine(&quot;Ключ не найден.&quot;);
            return null;
        }
        if (!ValidateCertificate(certificate))
        {
            return null;
        }
        //заглушка для вызовы диалога выбора носителя ключа
        byte[] buff = new byte[8192];
        var contentInfo = new ContentInfo(buff);

        // сертификат для подписания
        SignedCms signedCms = new SignedCms(contentInfo, true);
        try
        {
            // Вычисляем подпись
            var cmsSigner = new CmsSigner(certificate);
            signedCms.ComputeSignature(cmsSigner, false);
        }
        catch (System.Security.Cryptography.CryptographicException ex)
        {
            Console.WriteLine(ex.Message);
            return null;
        }
        return certificate;
    }
     /// &lt;summary&gt;
     /// Проверка валидности сертификата
     /// &lt;/summary&gt;
    private bool ValidateCertificate(X509Certificate2 x509)
    {
        bool valid = false;
        DateTime timeSert = DateTime.Parse(x509.GetExpirationDateString());

        if (DateTime.Now.CompareTo(timeSert) &lt; 0)
        {
            // Console.WriteLine(&quot;Сертификат валиден. Текущая дата: &quot; + DateTime.Now.ToString() + &quot; Дата сертификата: &quot; + timeSert.ToString()); */
            valid = true;
        }
        else
        {
            Console.WriteLine(&quot;Сертификат не валиден. Текущая дата: &quot; + DateTime.Now.ToString() + &quot; Дата сертификата: &quot; + timeSert.ToString());
        }

        return valid;
    }</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (system9266)]]></author>
			<pubDate>Wed, 28 Dec 2016 06:44:42 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10243/#p10243</guid>
		</item>
		<item>
			<title><![CDATA[Re: Работа с rutoken. C#]]></title>
			<link>https://forum.rutoken.ru/post/10242/#p10242</link>
			<description><![CDATA[<p>Добрый день, ваш вопрос к сожалению слишком расплывчатый, чтобы на него можно было бы конкретно ответить. <br />ознакомьтесь для начала с комплектом разработчика: <a href="https://www.rutoken.ru/developers/sdk/">https://www.rutoken.ru/developers/sdk/</a> и порталом документации <a href="http://dev.rutoken.ru">http://dev.rutoken.ru</a></p>]]></description>
			<author><![CDATA[null@example.com (Кирилл Мещеряков)]]></author>
			<pubDate>Tue, 27 Dec 2016 16:08:32 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10242/#p10242</guid>
		</item>
		<item>
			<title><![CDATA[Работа с rutoken. C#]]></title>
			<link>https://forum.rutoken.ru/post/10241/#p10241</link>
			<description><![CDATA[<p>Здравствуйте.<br />Подскажите пожалуйста как можно определить вставлен ли rutoken в ПК?<br />Интересуют так же способы определения на rutoken наличия актуальных сертификатов (не просроченных).<br />всё варианты на c#</p>]]></description>
			<author><![CDATA[null@example.com (system9266)]]></author>
			<pubDate>Tue, 27 Dec 2016 09:37:57 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/10241/#p10241</guid>
		</item>
	</channel>
</rss>
