Работа с сертификатами на Rutoken S [Решено]
Цитата: Сергей Н. от 30.09.2020, 07:14Если за последние годы ничего не поменялось, то суть таких Токенов как раз в том, что они аппаратно сделаны так, чтобы считывались только специальными утилитами.
Когда я пользовался Рутокенами по работе, то на него можно было записать электронную подпись как вместе с открытым сертификатом, так и без него.
Если открытого сертификата на Рутокене не записано, то и читать не чего там. И да, это не флешка, хоть и похожа на нее, это совсем другой устройство.С добрым утром.
Я думаю особо ничего не поменялось, в плане хранения и защиты ЭЦП. Но появились SDK. У Рутокена они бесплатные, потому что защищать им нечего, они по сути предоставляют лишь контейнер. Так же есть КриптПро.Net. Штука уже платная (стоит конечно не дорого, что-то там около 10 баксов вроде), но даже 10 баксов не хочется тратить впустую, потому что не уверен в результате. А пообщавшись с ТП одной и другой стороны, как-то осталось очень уж много вопросов, по работе с этими SDK. Поэтому вот и прочесывают "гугл" на наличие примера решения без SDK и пример работы самой SDK, только не просто исходник класса, а именно живой пример, чтобы понять как это вообще работает. А иначе я бы просто купил готовую библиотеку с ТП и не парился бы) Но это не наш метод) хочется всё же разобраться, а не просто копипастить, даже не понимая сути. А в моем случае, так вообще, то что я взял из SDK на ГОСТ-2001 отказывается работать даже сам шаблон поиска, то есть именно тот момент, когда мне надо четко сказать: "хочу искать сертификат вот тут" (то есть на устройстве Rutoken S).
Как-то так в общем...
Ладно, в любом случае спасибо всем за помощь. Буду даже изучать забугорные гуглы)
Если за последние годы ничего не поменялось, то суть таких Токенов как раз в том, что они аппаратно сделаны так, чтобы считывались только специальными утилитами.
Когда я пользовался Рутокенами по работе, то на него можно было записать электронную подпись как вместе с открытым сертификатом, так и без него.
Если открытого сертификата на Рутокене не записано, то и читать не чего там. И да, это не флешка, хоть и похожа на нее, это совсем другой устройство.
С добрым утром.
Я думаю особо ничего не поменялось, в плане хранения и защиты ЭЦП. Но появились SDK. У Рутокена они бесплатные, потому что защищать им нечего, они по сути предоставляют лишь контейнер. Так же есть КриптПро.Net. Штука уже платная (стоит конечно не дорого, что-то там около 10 баксов вроде), но даже 10 баксов не хочется тратить впустую, потому что не уверен в результате. А пообщавшись с ТП одной и другой стороны, как-то осталось очень уж много вопросов, по работе с этими SDK. Поэтому вот и прочесывают "гугл" на наличие примера решения без SDK и пример работы самой SDK, только не просто исходник класса, а именно живой пример, чтобы понять как это вообще работает. А иначе я бы просто купил готовую библиотеку с ТП и не парился бы) Но это не наш метод) хочется всё же разобраться, а не просто копипастить, даже не понимая сути. А в моем случае, так вообще, то что я взял из SDK на ГОСТ-2001 отказывается работать даже сам шаблон поиска, то есть именно тот момент, когда мне надо четко сказать: "хочу искать сертификат вот тут" (то есть на устройстве Rutoken S).
Как-то так в общем...
Ладно, в любом случае спасибо всем за помощь. Буду даже изучать забугорные гуглы)
Цитата: Сергей Н. от 02.10.2020, 11:18В общем разобрался.
Для работы (в моем случае с Rutoken S с ГОСТ-2001), надо использовать sdk от КриптоПро. если хотим читать прямо с носителя, например вот так:
[spoiler]CspParameters csp = new CspParameters(); csp.ProviderType = 75; csp.KeyContainerName = Gost3410CryptoServiceProvider.SelectContainer(true, false, IntPtr.Zero); Gost3410CryptoServiceProvider gost = new Gost3410CryptoServiceProvider(csp);[/spoiler]
Если же хотим читать просто сертификат из локального хранилища, то вообще не обязательно никаких SDK производителей, достаточно использовать стандартный X509, например вот так:
[spoiler]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) { //бла-бла-бла }[/spoiler]
Собственно вот и все. Вдруг кому-то пригодится...
зы
научился пользоваться спойлерами))
В общем разобрался.
Для работы (в моем случае с 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)
{
//бла-бла-бла
}
Собственно вот и все. Вдруг кому-то пригодится...
зы
научился пользоваться спойлерами))