Вы должны войти, чтобы создавать сообщения и темы.

Работа с сертификатами на Rutoken S [Решено]

◄Страница 2 из 2

Если за последние годы ничего не поменялось, то суть таких Токенов как раз в том, что они аппаратно сделаны так, чтобы считывались только специальными утилитами. 
Когда я пользовался Рутокенами по работе, то на него можно было записать электронную подпись как вместе с открытым сертификатом, так и без него.
Если открытого сертификата на Рутокене не записано, то и читать не чего там. И да, это не флешка, хоть и похожа на нее, это совсем другой устройство. 

С добрым утром.

Я думаю особо ничего не поменялось, в плане хранения и защиты ЭЦП. Но появились SDK. У Рутокена они бесплатные, потому что защищать им нечего, они по сути предоставляют лишь контейнер. Так же есть КриптПро.Net. Штука уже платная (стоит конечно не дорого, что-то там около 10 баксов вроде), но даже 10 баксов не хочется тратить впустую, потому что не уверен в результате. А пообщавшись с ТП одной и другой стороны, как-то осталось очень уж много вопросов, по работе с этими SDK. Поэтому вот и прочесывают "гугл" на наличие примера решения без SDK и пример работы самой SDK, только не просто исходник класса, а именно живой пример, чтобы понять как это вообще работает. А иначе я бы просто купил готовую библиотеку с ТП и не парился бы) Но это не наш метод) хочется всё же разобраться, а не просто копипастить, даже не понимая сути. А в моем случае, так вообще, то что я взял из SDK на ГОСТ-2001 отказывается работать даже сам шаблон поиска, то есть именно тот момент, когда мне надо четко сказать: "хочу искать сертификат вот тут" (то есть на устройстве Rutoken S).
Как-то так в общем...
Ладно, в любом случае спасибо всем за помощь. Буду даже изучать забугорные гуглы)

В общем разобрался.
Для работы (в моем случае с Rutoken S с ГОСТ-2001), надо использовать sdk от КриптоПро. если хотим читать прямо с носителя, например вот так:

Спойлер

CspParameters csp = new CspParameters();
                    csp.ProviderType = 75;
                    csp.KeyContainerName = Gost3410CryptoServiceProvider.SelectContainer(true, false, IntPtr.Zero);
                    Gost3410CryptoServiceProvider gost = new Gost3410CryptoServiceProvider(csp);

Если же хотим читать просто сертификат из локального хранилища, то вообще не обязательно никаких SDK производителей, достаточно использовать стандартный X509, например вот так:

Спойлер

X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
                store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
                X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
                X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, false);
                X509Certificate2Collection scollection = X509Certificate2UI.SelectFromCollection(fcollection, "Выбор сертификата", "Выбирите сертификат, который необходимо прочитать ", X509SelectionFlag.MultiSelection);

                foreach (X509Certificate2 x509 in scollection)
                {
                    try
                    {
                        Console.WriteLine("Friendly Name: {0}{1}", x509.FriendlyName, Environment.NewLine); //показывает всякое необходимое
                        Console.WriteLine("Simple Name: {0}{1}", x509.GetNameInfo(X509NameType.SimpleName, true), Environment.NewLine);
                        
                        X509Certificate2UI.DisplayCertificate(x509); //показывает сертификат перед прочтением
                        x509.Reset();
                    }
                    catch (CryptographicException ex)
                    {
                        //бла-бла-бла
                    }

Собственно вот и все. Вдруг кому-то пригодится...

зы
научился пользоваться спойлерами))

Лайкнул XpucT
XpucT
◄Страница 2 из 2