Forum

Пожалуйста or Регистрация для создания сообщений и тем.

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

Page 1 of 2Next

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

Возможно найдется кто-то знающий, как вытащить значения полей сертификата (в идеале, который находится на носителе 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);
        }
    }

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

Page 1 of 2Next