Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.07.2012(UTC) Сообщений: 34
|
Делаю службу, и по этому не могу выводить диалоговые окна. Функция CryptAcquireCertificatePrivateKey в режиме silent и если не установлен pin выдаёт ошибку NTE_SILENT_CONTEXT. Как имея данные о сертификате(CERT_CONTEXT) получить провайдер ключа и ввести пин? Пробовал перебором всех контейнеров и их ключей. Но если в ключе нету сертификата, то как понять что данный сертификат относится к данному ключу?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,408  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 722 раз в 626 постах
|
Ссылка на контейнер и провайдер хранится в контексте сертификат в хранилище. Самое простое - положить туда-же пин в виде параметра. Вот кусочек кода - надеюсь, укажет направление Код:
if (bSaveCertContextPin && szPassword)
{
stProvInfo.cProvParam = 1;
stProvInfo.rgProvParam = &key_prov_param;
key_prov_param.dwFlags = 0;
key_prov_param.dwParam = PP_KEYEXCHANGE_PIN;
key_prov_param.pbData = (BYTE*)T2A(szPassword);
key_prov_param.cbData = (DWORD)_tcslen(szPassword) + 1;
}
/* Установить ссылку на секретный ключ.*/
if (!CertSetCertificateContextProperty (pCertContext,
CERT_KEY_PROV_INFO_PROP_ID,
0,
&stProvInfo))
}
Отредактировано пользователем 30 ноября 2012 г. 19:28:58(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.07.2012(UTC) Сообщений: 34
|
Спасибо. Получилось что функция CertSetCertificateContextProperty отработала без ошибки, а пин всёравно нужен. Или там есть флаг "запомнить пароль"?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,408  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 722 раз в 626 постах
|
Нужно потом открыть контекст сертификата и посмотреть, есть ли в нем пин. CryptAcquireCertificatePrivateKey должна будет его задавать автоматом. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.07.2012(UTC) Сообщений: 34
|
А почему может не отрабатывать CertSetCertificateContextProperty с пустым GetLastError? код: Код:
pKeyInfo.cProvParam = sizeof (CRYPT_KEY_PROV_INFO);
pKeyInfo.rgProvParam = &key_prov_param;
key_prov_param.dwFlags = 0;
key_prov_param.dwParam = PP_KEYEXCHANGE_PIN;
key_prov_param.pbData = (BYTE*)pin;
key_prov_param.cbData = (DWORD)strlen(pin) + 1;
if(!CertSetCertificateContextProperty(pCert,
CERT_KEY_PROV_INFO_PROP_ID,
0,
&pKeyInfo))
{
error = GetLastError();
}
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.07.2012(UTC) Сообщений: 34
|
И где в контексте посмотреть что есть пин?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,408  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 722 раз в 626 постах
|
Он отрабатывает, контекст сертификата нужно теперь в хранилище положить, или использовать сразу после задания пина. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.07.2012(UTC) Сообщений: 34
|
В том то и проблема что CertSetCertificateContextProperty не отрабатывает, а GetLastError возвращает 0. Пробую дальше с этим контекстом сертификата CryptAcquireCertificatePrivateKey с флагом silent и он возвращает ошибку NTE_BAD_PUBLIC_KEY, при условии что пароль верный.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.07.2012(UTC) Сообщений: 34
|
А может быть такое что в моём сертификате нету никаких данных по структуре CRYPT_KEY_PROV_INFO? Всегда ли сертификат хранит в себе информацию о контейнере закрытого ключа? Если нет, то как быть с сертификатами, которых не в контейнере?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 30.07.2012(UTC) Сообщений: 34
|
Сделал так: получаю CRYPT_KEY_PROV_INFO через CertПetCertificateContextProperty, пишу туда PP_KEYEXCHANGE_PIN. Отправляю через CertSetCertificateContextProperty. Но CryptAcquireCertificatePrivateKey с флагом silent возвращает ошибку NTE_BAD_PUBLIC_KEY, при условии что пароль верный. В чём проблема?
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close