Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline postoronnim74  
#1 Оставлено : 8 февраля 2018 г. 9:15:19(UTC)
postoronnim74

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.11.2017(UTC)
Сообщений: 8

Сказал(а) «Спасибо»: 1 раз
Доброго дня, уважаемые участники форума.
Подскажите, каким образом можно программно удалить контейнер со смарт-карты? Язык разработки C#.
Я попытался сделать так:
Код:

            var privateKey = new CX509PrivateKey()
            {
                ProviderName = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",
                ProviderType = (X509ProviderType)PROV_GOST_2001_DH,
                Pin = pin,
                ContainerName = containerName,
                Existing = true
            };

            privateKey.Delete();

containerName указан правильный (что то типа "\\\\.\\OMNIKEY CardMan 3x21 0\\lr-31889159-65f6-4026-a5d3-a4ac094fa482"), pin код также корректный.
Но при вызове privateKey.Delete() возникает окошко для ввода PIN кода (хотя я его уже указал в конструкторе CX509PrivateKey).
Если ввести в этом окне PIN код (точно такой же, какой был подан в конструктор CX509PrivateKey), то контейнер успешно удаляется.
Как избавится от этого окна?
Способ
Код:

            String PROVIDER_NAME = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider";
            uint type = 75;

            IntPtr hProv = IntPtr.Zero;

            if (!CryptAcquireContext(ref hProv, containerName, PROVIDER_NAME, type, CRYPT_DELETEKEYSET))
            {
                throw new Exception("Ошибка получения контекста криптопровайдера", new Win32Exception(Marshal.GetLastWin32Error()));
            }

также не подходит - возникает окно с предложением ввести PIN код...
Заранее благодарю за ответы!
Offline Aleksandr G*  
#2 Оставлено : 8 февраля 2018 г. 9:28:54(UTC)
Aleksandr G*

Статус: Активный участник

Группы: Участники
Зарегистрирован: 13.09.2016(UTC)
Сообщений: 126

Сказал(а) «Спасибо»: 8 раз
Поблагодарили: 35 раз в 28 постах
Попробуйте добавить:

Код:
Silent = true
thanks 1 пользователь поблагодарил Aleksandr G* за этот пост.
postoronnim74 оставлено 08.02.2018(UTC)
Offline postoronnim74  
#3 Оставлено : 8 февраля 2018 г. 9:58:15(UTC)
postoronnim74

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.11.2017(UTC)
Сообщений: 8

Сказал(а) «Спасибо»: 1 раз
Добавил. Теперь метод privateKey.Delete() выбрасывает исключение "Нет доступа к карте. Введен неправильный PIN-код".
Хотя PIN-код указан правильный, с помощью него можно протестировать контейнер в виджете CSP, а также удалить контейнер.
Т.е. если я убираю Silent, мне выдается окно для ввода PIN, я ввожу тот же самый PIN, что указан в коде, и контейнер удаляется.
Единственное, что меня смущает - я подаю PIN код как строку, а в описании IX509PrivateKey сказано, что это
Код:

HRESULT put_Pin(
  [in] BSTR Value
);

Хотя, при создании нового ключа PIN также задается в виде строки и никаких проблем нет:
Код:

                var privateKey = new CX509PrivateKey()
                {
                    ProviderType = (X509ProviderType)PROV_GOST_2001_DH,
                    Pin = pin,
                    ReaderName = readerName
                };

                var request = new CX509CertificateRequestPkcs10();
                request.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, privateKey, String.Empty);

В чем может быть проблема?
Offline postoronnim74  
#4 Оставлено : 8 февраля 2018 г. 15:19:37(UTC)
postoronnim74

Статус: Новичок

Группы: Участники
Зарегистрирован: 22.11.2017(UTC)
Сообщений: 8

Сказал(а) «Спасибо»: 1 раз
Всем спасибо, тема закрыта. Сделал так:
Код:

        public static void RemoveContainer(String containerName, String pin)
        {
            IntPtr hProv = IntPtr.Zero;

            try
            {
                if (!CryptAcquireContext(ref hProv, containerName, PROVIDER_NAME, PROVIDER_TYPE, 0))
                {
                    throw new Exception("Ошибка получения контекста криптопровайдера.", new Win32Exception(Marshal.GetLastWin32Error()));
                }

                if (!CryptSetProvParam(hProv, PP_KEYEXCHANGE_PIN, Encoding.ASCII.GetBytes(pin), 0))
                {
                    throw new Exception("Ошибка ввода пин-кода.", new Win32Exception(Marshal.GetLastWin32Error()));
                }

                if (!CryptSetProvParam(hProv, PP_DELETE_KEYSET, null, 0))
                {
                    throw new Exception("Ошибка удаления контейнера.", new Win32Exception(Marshal.GetLastWin32Error()));
                }
            }
            finally
            {
                if (hProv != IntPtr.Zero)
                {
                    CryptReleaseContext(hProv, 0);
                }
            }
        }
Offline Boris@Serezhkin.com  
#5 Оставлено : 22 февраля 2018 г. 0:53:38(UTC)
Boris@Serezhkin.com

Статус: Активный участник

Группы: Участники
Зарегистрирован: 26.08.2010(UTC)
Сообщений: 259
Откуда: Moscow

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Ну закрыта, так закрыта.
Однако когда я споткнулся на вводе пина при подписи
у меня получилось нечто следующее.
Правда надо определить параметры и номер провайдера....
Код:
   public static void setPin(X509Certificate2 cert, string spin)
    {
      CryptoPro.Sharpei.Gost3410CryptoServiceProvider prov = 
        (CryptoPro.Sharpei.Gost3410CryptoServiceProvider)cert.PrivateKey;
 
      //CspParameters pars = new CspParameters(75, null, "test33");
      //// если необходимо запретить вывод окна и при неправильном пароле получить ошибку, 
      //// запрещаем окна
      //pars.Flags = CspProviderFlags.NoPrompt;
      
      System.Security.SecureString s = new System.Security.SecureString();
      // заполняем пароль... например так
      for (int j = 0; j < spin.Length; s.AppendChar(spin[j++]));
      // и передаем его в провайдер.
      prov.SetContainerPassword(s);
      //если необходимо, то можно сразу и проверить пароль, например, так
      byte[] dummyHash = new byte[32]; prov.SignHash(dummyHash);
     }

И более при подписи надцати айтемов пин не спрашивают

Отредактировано пользователем 22 февраля 2018 г. 3:11:52(UTC)  | Причина: орфография

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.