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

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

Страница 1 из 2►

Доброго всем дня!

Возможно найдется кто-то знающий, как вытащить значения полей сертификата (в идеале, который находится на носителе Rutoken)?
Например открытый ключ или серийный номер.

Если пытаться тащить через X509Certificate2, то ничего не выходит, пишет что угодно но только не то что показано на рисунке...
Смотрел Rutoken SDK, но не хватает опыта чтобы с ним разобраться(
Возможно кто-то даст какую-то подсказку или кусочек чего-то для примера, буду благодарен.

Цитата: Сергей Н. от 29.09.2020, 07:19

Например открытый ключ или серийный номер.

Если пытаться тащить через X509Certificate2, то ничего не выходит, пишет что угодно но только не то что показано на рисунке...

Добрый день.
Не может быть. Скрин в студию.

Лайкнул Сергей Н.
Сергей Н.
Цитата: Adler от 29.09.2020, 07:36
Цитата: Сергей Н. от 29.09.2020, 07:19

Например открытый ключ или серийный номер.

Если пытаться тащить через X509Certificate2, то ничего не выходит, пишет что угодно но только не то что показано на рисунке...

Добрый день.
Не может быть. Скрин в студию.

Да, и правда, затупил) Прошу прощения) Использовал не тот метод, но получить ключ получилось))
Пока не начнешь тупить и не спросишь, ничего не получается))

Прочитать поле открытый ключ удалось) методом (пускай лежит тут, вдруг кому-то пригодится):

Спойлер

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
                {
                    tbresult.Text = x509.GetPublicKeyString().ToString();
                    X509Certificate2UI.DisplayCertificate(x509);
                    x509.Reset();
                }
                catch (CryptographicException)
                {
                    //Console.WriteLine("...");
                }
            }
            store.Close();

Но это с сертификатом из локального хранилища...
А вот как прочесть то, что находится уже на носителе, так и не выходит. Брал пример из rutoken-sdk (класс GetCertificateInfo_GOST3410_2001).
Ругается вот на это:

И дальше я не продвинулся, совершенно не понимаю что с этим делать(

Ну с токеном не подскажу, т.к. с трудом представляю о чем речь, а с сертификатами несколько лет назад разбирался в плане генерации, конвертации и т.д.
P.S. а в каком виде сертификат на токене. Просто файл?

Сертификат на рутокене выглядит вот так:

То есть, если нажать на "Свойства", то мы увидим собственно сам сертификат и его состав, тут по сути не происходит ни какого шифрования же, ПИН-код при это не нужен, пара тоже не нужна, то есть это просто типа "чтение". Ну а в свойствах уже можно посмотреть всё ту же информацию в составе.
И вот как попасть на рутокен, вообще не понимаю... ТП на их форме как-то не охотно подсказывает, отправляют к своим SDK и на этом разговор окончен, а как с этим SDK работать, в силу своей неопытности нифига не понимаю((

Цитата: Сергей Н. от 29.09.2020, 07:19

Доброго всем дня!

Возможно найдется кто-то знающий, как вытащить значения полей сертификата (в идеале, который находится на носителе Rutoken)?
Например открытый ключ или серийный номер.

Если пытаться тащить через X509Certificate2, то ничего не выходит, пишет что угодно но только не то что показано на рисунке...
Смотрел Rutoken SDK, но не хватает опыта чтобы с ним разобраться(
Возможно кто-то даст какую-то подсказку или кусочек чего-то для примера, буду благодарен.

что то типа такого надо?

Лайкнул Сергей Н.
Сергей Н.

Ну почти да, вытягивать поля у меня уже получилось. Самое интересное это не просто прочесть состав какого-то сертификата, а прочесть состав сертификата именно со вставленного USB-носителя Rutoken S...

Цитата: Сергей Н. от 29.09.2020, 09:28

Ну почти да, вытягивать поля у меня уже получилось. Самое интересное это не просто прочесть состав какого-то сертификата, а прочесть состав сертификата именно со вставленного USB-носителя Rutoken S...

А разница от куда читать то?

X509Certificate2UI.SelectFromCollection

Этот класс отобразит все сертификаты. Если подключен ключ то он тоже отобразится. Читаете точно так же как и выше.

Цитата: Roman Anderson [anomal3] от 29.09.2020, 09:43
Цитата: Сергей Н. от 29.09.2020, 09:28

Ну почти да, вытягивать поля у меня уже получилось. Самое интересное это не просто прочесть состав какого-то сертификата, а прочесть состав сертификата именно со вставленного USB-носителя Rutoken S...

А разница от куда читать то?

 
 
 
 
X509Certificate2UI.SelectFromCollection
X509Certificate2UI.SelectFromCollection
 
X509Certificate2UI.SelectFromCollection

Этот класс отобразит все сертификаты. Если подключен ключ то он тоже отобразится. Читаете точно так же как и выше.

Но я не вижу сертификата который у меня на носителе при использовании этого класса... Он показывает сертификаты из "локальный пользователь\личное\реестр\сертификаты"...
Собственно вот:

Возможно, нужно использовать какой-то метод еще

Цитата: Сергей Н. от 29.09.2020, 11:16
Цитата: Roman Anderson [anomal3] от 29.09.2020, 09:43
Цитата: Сергей Н. от 29.09.2020, 09:28

Ну почти да, вытягивать поля у меня уже получилось. Самое интересное это не просто прочесть состав какого-то сертификата, а прочесть состав сертификата именно со вставленного USB-носителя Rutoken S...

А разница от куда читать то?

 
 
 
 
X509Certificate2UI.SelectFromCollection
X509Certificate2UI.SelectFromCollection
 
X509Certificate2UI.SelectFromCollection

Этот класс отобразит все сертификаты. Если подключен ключ то он тоже отобразится. Читаете точно так же как и выше.

Но я не вижу сертификата который у меня на носителе при использовании этого класса... Он показывает сертификаты из "локальный пользователь\личное\реестр\сертификаты"...
Собственно вот:

Возможно, нужно использовать какой-то метод еще

А что мешает открыть его? почему Вы хотите именно выбрать из хранилища?
Можно открыть OpenFileDialog  а можно поместить копию сертификата с ключа в хранилище сертификатов

Спойлер

internal static byte[] ReadFile(string fileName)
   {
       FileStream f = new FileStream(fileName, FileMode.Open, FileAccess.Read);
       int size = (int)f.Length;
       byte[] data = new byte[size];
       size = f.Read(data, 0, size);
       f.Close();
       return data;
   }

void m_LoadCert(){
 using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.InitialDirectory = "c:\\";
                openFileDialog.Filter = "Cert files (*.crt)|*.crt|All files (*.*)|*.*";
                openFileDialog.FilterIndex = 2;
                openFileDialog.RestoreDirectory = true;

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    //Get the path of specified file
                    filePath = openFileDialog.FileName;

                    try
                    {
                        X509Certificate2 x509 = new X509Certificate2();
                        //Create X509Certificate2 object from .cer file.
                        byte[] rawData = ReadFile(filePath);
                        x509.Import(rawData);

                        //Extensions class
                        textBox1.ExtendedTextBox(x509);

                        X509Store store = new X509Store();
                        store.Open(OpenFlags.MaxAllowed);
                        store.Add(x509);
                        store.Close();
                    }
                    catch (DirectoryNotFoundException)
                    {
                        MessageBox.Show("Error: The directory specified could not be found.", "DirectoryNotFoundException", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    catch (IOException)
                    {
                        MessageBox.Show("Error: A file in the directory could not be accessed.", "IOException", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    catch (NullReferenceException)
                    {
                        MessageBox.Show("File must be a .cer file. Program does not have access to that type of file.", "NullReferenceException", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
}

 public static class Extensions
    {
        /// <summary>
        /// Extension for textbox
        /// </summary>
        /// <param name="tb">Sugar sintax</param>
        /// <param name="x509">input param</param>
        public static void ExtendedTextBox(this TextBox tb, System.Security.Cryptography.X509Certificates.X509Certificate2 x509)
        {
            var @string = new string[] {
            "Subject: " + x509.Subject,
            "Issuer: " + x509.Issuer,
            "Version: " + x509.Version,
            "Valid Date: " + x509.NotBefore,
            "Expiry Date: " + x509.NotAfter,
            "Thumbprint: " + x509.Thumbprint,
            "Serial Number: "+ x509.SerialNumber,
            "Friendly Name: "+ x509.PublicKey.Oid.FriendlyName,
            "Public Key Format: "+ x509.PublicKey.EncodedKeyValue.Format(true),
            "Raw Data Length: "+ x509.RawData.Length,
            "Certificate to string: "+ x509.ToString(true),
            "Certificate to XML String: "+ x509.PublicKey.Key.ToXmlString(false) };
            tb.Text = string.Join(Environment.NewLine, @string);
        }
    }

Выбираете сертификат ручками по пути и читаете его.

Просьба ко всем. 
1. Посмотрите видео по оформлению постов. 
2. Картинки и большой текст прячьте под спойлер. 

Просто пролистайте эту тему и поймёте, что она стала нечитабельна в принципе.

Лайкнул Mikhail
Mikhail
Голова дана человеку не для того, чтобы кушать, а для того, чтобы думать.
Цитата: Roman Anderson [anomal3] от 29.09.2020, 16:31

Выбираете сертификат ручками по пути и читаете его.

Так в том то и вопрос, как можно выбрать сертификат ручками с носителя типа Rutoken?
Это же не флешка, где я могу использовать OpenFileDialog, это именно что Rutoken.
И вопрос в том, как прочитать сертификат именно с Rutoken, а не из локального хранилища или файла *.cer из простого каталога.

Цитата: Андрей от 29.09.2020, 16:45

Просьба ко всем. 
1. Посмотрите видео по оформлению постов. 
2. Картинки и большой текст прячьте под спойлер. 

Просто пролистайте эту тему и поймёте, что она стала нечитабельна в принципе.

Добрый день, Андрей.
Прошу прощения за кажущийся беспорядок. Никогда раньше не пользовался форумами и даже не догадываюсь что такое "спойлер" и как под него прятать текст...
Обещаю разобраться на досуге.

И вопрос в том, как прочитать сертификат именно с Rutoken, а не из локального хранилища или файла *.cer из простого каталога.

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

Голова дана человеку не для того, чтобы кушать, а для того, чтобы думать.
Страница 1 из 2►