Работа с rutoken. C#

Здравствуйте.
Подскажите пожалуйста как можно определить вставлен ли rutoken в ПК?
Интересуют так же способы определения на rutoken наличия актуальных сертификатов (не просроченных).
всё варианты на c#

Re: Работа с rutoken. C#

Добрый день, ваш вопрос к сожалению слишком расплывчатый, чтобы на него можно было бы конкретно ответить.
ознакомьтесь для начала с комплектом разработчика: https://www.rutoken.ru/developers/sdk/ и порталом документации http://dev.rutoken.ru

(2016-12-28 09:54:46 отредактировано system9266)

Re: Работа с rutoken. C#

Посмотрите пожалуйста на мой кастыль. Посоветуйте, как его улучшить и будет ли он работать правильно?

У меня работает, результат тестирования :

С помощью метода "ПредварительнаяПроверкаПередПодписанием", пользователю предоставляется выбор сертификата, если пользователь не выбирает сертификат, получаем сообщение и возвращаем Null,  если выбранный сертификат просроченный, получаем сообщение об этом и возратим null, если сертификат валидный, пробуем найти ключ, если ключа нет, получаем отрицательный результат проверки и метод возвратит null.

Если сертификат выбранный пользователем не просроченный и вставлен ключевой носитель, то метод вернёт сертификат для дальнейшего подписания с него.

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

   

    /// <summary>
    /// Возвращает валидный сертификат или null если валидный сертификат отсутствует
    /// </summary>
    /// <returns></returns>
    public X509Certificate2 ПредварительнаяПроверкаПередПодписанием()
    {
        // Находим секретный ключ по сертификату в хранилище MY
        X509Store store = new X509Store("My", StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);

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

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

        X509Certificate2 certificate = coll[0];

        if (certificate == null /*|| certificate.Verify()*/)
        {
            Console.WriteLine("Ключ не найден.");
            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;
    }
     /// <summary>
     /// Проверка валидности сертификата
     /// </summary>
    private bool ValidateCertificate(X509Certificate2 x509)
    {
        bool valid = false;
        DateTime timeSert = DateTime.Parse(x509.GetExpirationDateString());

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

        return valid;
    }

Re: Работа с rutoken. C#

Добрый день.
Похоже, что ваш код рабочий, но я не вижу где в нем хоть какая-то работа с Рутокен?