Статус: Участник
Группы: Участники
Зарегистрирован: 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, то показывает, что на нем имеются два сертификата, и у каждого есть открытый ключ.
Буду признателен за ответ.
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.11.2010(UTC) Сообщений: 12
|
В продолжение этой же темы.
Открываю КриптоПро CSP -> Сервис -> Контейнер закрытого ключа -> Протестировать... Обзор -> Выбираю имя ключевого контейнера (совпадает с тем, какое я получаю в программе) Ввожу пин-код, получаю: Проверка завершена успешно - ошибок не обнаружено Контейнер закрытого ключа, имя - такое же загрузка ключей - успешно Ключ обмена - доступен Сертификат в контейнере - соответствует закрытому ключу Ключ подписи - отсутствует
Как все это понять? Есть ли все-таки ключ на etoken'е и почему CryptGetUserKey возвращает NTE_NO_KEY?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,449  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 747 раз в 642 постах
|
А что возвращает первый CryptAcquireContext? |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.11.2010(UTC) Сообщений: 12
|
возвращает true... Пробовал 0 вместо CRYPT_MACHINE_KEYSET - то же самое Отредактировано пользователем 24 января 2011 г. 15:28:26(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,449  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 747 раз в 642 постах
|
Магия какая-то. А контейнер тестируется точно с токена? Если указать имя провайдера в AcquireContext? |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 Это вроде как раз он...
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,449  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 38 раз Поблагодарили: 747 раз в 642 постах
|
|
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.11.2010(UTC) Сообщений: 12
|
Получил от техподдержки совет, который помог: заменил HCRYPTKEY* phUserKey = NULL; if(!CryptGetUserKey(hCP, dwKeySpec, phUserKey)) на HCRYPTKEY hUserKey = NULL; if(!CryptGetUserKey(hCP, dwKeySpec, &hUserKey)) Теперь работает! :0)
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 16.04.2008(UTC) Сообщений: 1,643
Сказал(а) «Спасибо»: 49 раз Поблагодарили: 704 раз в 486 постах
|
Поправили провайдер, в новых сборках в таких случаях будет возвращаться ошибка ERROR_INVALID_PARAMETER. |
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close