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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline Treno1  
#1 Оставлено : 30 ноября 2012 г. 18:57:37(UTC)
Treno1

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

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

Делаю службу, и по этому не могу выводить диалоговые окна. Функция CryptAcquireCertificatePrivateKey в режиме silent и если не установлен pin выдаёт ошибку NTE_SILENT_CONTEXT. Как имея данные о сертификате(CERT_CONTEXT) получить провайдер ключа и ввести пин? Пробовал перебором всех контейнеров и их ключей. Но если в ключе нету сертификата, то как понять что данный сертификат относится к данному ключу?
Offline Максим Коллегин  
#2 Оставлено : 30 ноября 2012 г. 19:26:41(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 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)  | Причина: Не указана

Знания в базе знаний, поддержка в центре поддержки
Offline Treno1  
#3 Оставлено : 30 ноября 2012 г. 19:46:30(UTC)
Treno1

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

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

Спасибо. Получилось что функция CertSetCertificateContextProperty отработала без ошибки, а пин всёравно нужен. Или там есть флаг "запомнить пароль"?
Offline Максим Коллегин  
#4 Оставлено : 30 ноября 2012 г. 19:55:17(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 722 раз в 626 постах
Нужно потом открыть контекст сертификата и посмотреть, есть ли в нем пин. CryptAcquireCertificatePrivateKey должна будет его задавать автоматом.
Знания в базе знаний, поддержка в центре поддержки
Offline Treno1  
#5 Оставлено : 30 ноября 2012 г. 20:10:53(UTC)
Treno1

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

Группы: Участники
Зарегистрирован: 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();
	}
Offline Treno1  
#6 Оставлено : 30 ноября 2012 г. 20:15:28(UTC)
Treno1

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

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

И где в контексте посмотреть что есть пин?
Offline Максим Коллегин  
#7 Оставлено : 30 ноября 2012 г. 20:23:58(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 722 раз в 626 постах
Он отрабатывает, контекст сертификата нужно теперь в хранилище положить, или использовать сразу после задания пина.
Знания в базе знаний, поддержка в центре поддержки
Offline Treno1  
#8 Оставлено : 7 декабря 2012 г. 13:38:00(UTC)
Treno1

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

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

В том то и проблема что CertSetCertificateContextProperty не отрабатывает, а GetLastError возвращает 0. Пробую дальше с этим контекстом сертификата CryptAcquireCertificatePrivateKey с флагом silent и он возвращает ошибку NTE_BAD_PUBLIC_KEY, при условии что пароль верный.
Offline Treno1  
#9 Оставлено : 7 декабря 2012 г. 14:58:51(UTC)
Treno1

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

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

А может быть такое что в моём сертификате нету никаких данных по структуре CRYPT_KEY_PROV_INFO? Всегда ли сертификат хранит в себе информацию о контейнере закрытого ключа? Если нет, то как быть с сертификатами, которых не в контейнере?
Offline Treno1  
#10 Оставлено : 7 декабря 2012 г. 17:17:41(UTC)
Treno1

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

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

Сделал так: получаю CRYPT_KEY_PROV_INFO через CertПetCertificateContextProperty, пишу туда PP_KEYEXCHANGE_PIN. Отправляю через CertSetCertificateContextProperty. Но CryptAcquireCertificatePrivateKey с флагом silent возвращает ошибку NTE_BAD_PUBLIC_KEY, при условии что пароль верный. В чём проблема?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.