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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline andrei_akm  
#1 Оставлено : 21 января 2011 г. 15:58:22(UTC)
andrei_akm

Статус: Участник

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

Необходимо получить открытый ключ, хранящийся на EToken'е.
Делаю так:

Получаю имя ContName контейнера на на EToken'е.
CryptAcquireContext(&hCP, ContName, NULL, PROV_GOST_2001_DH, CRYPT_MACHINE_KEYSET)
HCRYPTKEY* phUserKey = NULL;
DWORD dwKeySpec = AT_KEYEXCHANGE; //AT_SIGNATURE;
if(!CryptGetUserKey(hCP, dwKeySpec, phUserKey))
{
DWORD err = GetLastError();
}

Независимо от значения dwKeySpec функция CryptGetUserKey возвращает false и err = NTE_NO_KEY.
При этом если посмотреть свойства ключа через EToken Properties -> Advanced -> Keys & Certificates, то показывает, что на нем имеются два сертификата, и у каждого есть открытый ключ.

Буду признателен за ответ.
Offline andrei_akm  
#2 Оставлено : 24 января 2011 г. 13:47:49(UTC)
andrei_akm

Статус: Участник

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

В продолжение этой же темы.

Открываю КриптоПро CSP -> Сервис -> Контейнер закрытого ключа -> Протестировать...
Обзор -> Выбираю имя ключевого контейнера (совпадает с тем, какое я получаю в программе)
Ввожу пин-код, получаю:
Проверка завершена успешно - ошибок не обнаружено
Контейнер закрытого ключа, имя - такое же
загрузка ключей - успешно
Ключ обмена - доступен
Сертификат в контейнере - соответствует закрытому ключу
Ключ подписи - отсутствует

Как все это понять? Есть ли все-таки ключ на etoken'е и почему CryptGetUserKey возвращает NTE_NO_KEY?
Offline Максим Коллегин  
#3 Оставлено : 24 января 2011 г. 14:12:09(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,449
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 38 раз
Поблагодарили: 747 раз в 642 постах
А что возвращает первый CryptAcquireContext?
Знания в базе знаний, поддержка в центре поддержки
Offline andrei_akm  
#4 Оставлено : 24 января 2011 г. 15:24:12(UTC)
andrei_akm

Статус: Участник

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

возвращает true...
Пробовал 0 вместо CRYPT_MACHINE_KEYSET - то же самое

Отредактировано пользователем 24 января 2011 г. 15:28:26(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#5 Оставлено : 24 января 2011 г. 16:17:19(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,449
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 38 раз
Поблагодарили: 747 раз в 642 постах
Магия какая-то. А контейнер тестируется точно с токена? Если указать имя провайдера в AcquireContext?
Знания в базе знаний, поддержка в центре поддержки
Offline andrei_akm  
#6 Оставлено : 25 января 2011 г. 19:14:59(UTC)
andrei_akm

Статус: Участник

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

Пробовал тоже и так, тоже самое... :

if (!CryptAcquireContext(&hCP, L"bodrov", L"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", PROV_GOST_2001_DH, CRYPT_MACHINE_KEYSET))

Насчет единственности тоже задумывался... Не знаю, но если открыть "Тестирование контейнера закрытого ключа" -> Обзор...
то в списке ключевых контейнеров пользователя только одна строчка:
AKS ifdh 0 - bodrov
Это вроде как раз он...

Offline Максим Коллегин  
#7 Оставлено : 25 января 2011 г. 19:37:09(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,449
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 38 раз
Поблагодарили: 747 раз в 642 постах
UAC?
Выложите целиком неработающий пример.

Отредактировано пользователем 25 января 2011 г. 19:39:22(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в центре поддержки
Offline andrei_akm  
#8 Оставлено : 26 января 2011 г. 16:04:22(UTC)
andrei_akm

Статус: Участник

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

Получил от техподдержки совет, который помог:
заменил
HCRYPTKEY* phUserKey = NULL;
if(!CryptGetUserKey(hCP, dwKeySpec, phUserKey))
на
HCRYPTKEY hUserKey = NULL;
if(!CryptGetUserKey(hCP, dwKeySpec, &hUserKey))
Теперь работает! :0)

Offline Русев Андрей  
#9 Оставлено : 1 марта 2011 г. 14:54:48(UTC)
Русев Андрей

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,643

Сказал(а) «Спасибо»: 49 раз
Поблагодарили: 704 раз в 486 постах
Поправили провайдер, в новых сборках в таких случаях будет возвращаться ошибка ERROR_INVALID_PARAMETER.
Официальная техподдержка. Официальная база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.