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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Ильшат Абшарипов  
#1 Оставлено : 25 января 2008 г. 16:52:02(UTC)
Ильшат Абшарипов

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

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

Добрый день.

Как закрытый ключ связать с сертификатом? Есть импортированная в хранилище ключевая пара, мне надо, чтобы он был привязан к сертификату.

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

Offline Юрий  
#2 Оставлено : 25 января 2008 г. 17:43:15(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
CertSetCertificateContextProperty
С уважением,
Юрий Строжевский
Offline Ильшат Абшарипов  
#3 Оставлено : 25 января 2008 г. 17:50:13(UTC)
Ильшат Абшарипов

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

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

Прекрасно :)
А какие параметры передавать в эту функцию? Если не сложно, то дайте код.
Offline Юрий  
#4 Оставлено : 25 января 2008 г. 18:00:16(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Я в Вас верю - сами догадаетесь какие параметры туда передавать.
Главное - наличие MSDN, где можно про эти параметры почитать :)
С уважением,
Юрий Строжевский
Offline Ильшат Абшарипов  
#5 Оставлено : 25 января 2008 г. 18:17:33(UTC)
Ильшат Абшарипов

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

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

А не кажется ли вам, что если вопрос задается здесь на форуме, то ищется ответ сколько-нибудь развернутый, а не отсыл в гугл/мсдн/фак?

И потом, если вы гуру, то зачем скрываете свои знания? :)
Offline Юрий  
#6 Оставлено : 25 января 2008 г. 18:30:38(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Тогда задам вопрос я:
1) Вы посмотрели MSDN по этой функции?
2) Посмотрели примеры использования этой функции (там же в MSDN)?
3) Что-то попробывали?
4) Что не получилось?
С уважением,
Юрий Строжевский
Offline Ильшат Абшарипов  
#7 Оставлено : 25 января 2008 г. 18:46:11(UTC)
Ильшат Абшарипов

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

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

Вот это уже другой разговор :)

Я опишу задачу, ок?
Есть сертификат, есть экспортированная пара ключей. Мне надо установить этот сертификат и ключи в систему и связать их друг с другом.

Что у меня есть: сертификат в системе сохраняется, ключи в хранилище тоже попадают. Но привязать друг к другу не получается.
Код:

// получаю имя контейнера провайдера
CryptGetProvParam(hProv, PP_CONTAINER, PByte(Buf), BufSize, 0);
WideBuf1 := Buf;
provInfo.pwszContainerName := PWideChar(WideBuf1);

// получаю имя провайдера
CryptGetProvParam(hProv, PP_NAME, PByte(Buf), BufSize, 0)
WideBuf2 := Buf;
provInfo.pwszContainerName := PWideChar(WideBuf2);

// получаю тип провайдера 
CryptGetProvParam(hProv, PP_PROVTYPE, @DWordBuf, BufSize, 0)
provInfo.dwProvType := DWordBuf;

// заполняем 
provInfo.dwFlags := 0;
provInfo.cProvParam := 0;  
provInfo.rgProvParam := nil;
provInfo.dwKeySpec := AT_SIGNATURE;

// выставляем
CertSetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID, 0, @provInfo)

// пробовал и это
CertSetCertificateContextProperty(pCert, CERT_KEY_PROV_HANDLE_PROP_ID, 0, @hProv)

// и это тоже пробовал
KeyContext.cbSize := SizeOf(CERT_KEY_CONTEXT);
KeyContext.hCryptProv := hProv;
KeyContext.dwKeySpec := AT_SIGNATURE;
CertSetCertificateContextProperty(pCert, CERT_KEY_CONTEXT_PROP_ID, 0, @KeyContext)


Код проглатывается без ошибок, однако сертификат не связывается к ключом. То, что ключ привязан к сертификату, проверяю, открывая сертфикат в mmc/certificates.
Offline Ильшат Абшарипов  
#8 Оставлено : 25 января 2008 г. 18:55:08(UTC)
Ильшат Абшарипов

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

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

Решил проблему таки.

Сертификат в хранилище надо было добавлять уже после того, как добавлены ключи и установлена привязка ключей и сертификата.

И достаточно было следующего кода для привязки ключей и сертификата.
Код:
provInfo.pwszContainerName := nil;
provInfo.pwszProvName := nil;
provInfo.dwProvType := PROV_GOST_DH;
provInfo.dwFlags := 0;
provInfo.cProvParam := 0;  
provInfo.rgProvParam := nil;
provInfo.dwKeySpec := AT_SIGNATURE;
CertSetCertificateContextProperty(pCert, CERT_KEY_PROV_INFO_PROP_ID, 0, @provInfo)

Отредактировано пользователем 25 января 2008 г. 18:56:54(UTC)  | Причина: Не указана

Offline Юрий  
#9 Оставлено : 25 января 2008 г. 19:00:35(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Немного не понял: а "provInfo.pwszProvName" где?
Почему два раза "provInfo.pwszContainerName "?
С уважением,
Юрий Строжевский
Offline Юрий  
#10 Оставлено : 25 января 2008 г. 19:01:43(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Нет, сертификат сначала надо добавить в хранилище, а потом устанавливать связь с контейнером ключей.
С уважением,
Юрий Строжевский
Offline Юрий  
#11 Оставлено : 25 января 2008 г. 19:12:04(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
И еще: как последний приведенный код найдет к какому именно ключевому контейнеру привязываться? Указан только тип криптопровайдера и тип ключа. Этого мало.
С уважением,
Юрий Строжевский
Offline Ильшат Абшарипов  
#12 Оставлено : 28 января 2008 г. 13:15:15(UTC)
Ильшат Абшарипов

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

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

Да, в коде была опечатка
Код:

// получаю имя провайдера
CryptGetProvParam(hProv, PP_NAME, PByte(Buf), BufSize, 0)
WideBuf2 := Buf;
provInfo.pwszProvName := PWideChar(WideBuf2);


Согласен с замечанием, что стоит наверное указывать параметры контейнера.
А насчет порядка могу сказать следующее: когда сначала добавляем сертификат, потом привязываем ключи, то привязки не происходит. А если изменить порядок на обратный: добавляем ключи, привязываем сертификат, добавляем сертификат, то работает.
Возможно я что-то пропустил?
Offline Юрий  
#13 Оставлено : 28 января 2008 г. 20:03:34(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Работает следующая схема:
1) CertCreateCertificateContext
2) CertSetCertificateContextProperty(..., CERT_KEY_PROV_INFO_PROP_ID, ...)
3) CertOpenSystemStore
4) CertAddCertificateContextToStore
5) CertFreeCertificateContext
6) CertCloseStore
7) CryptReleaseContext

Не знаю какой вариант применяется у Вас. Экспериментировал с различными вариантами: попробуйте не освобождать контекст сертификата до закрытия хранилища. То есть просто сделайте "CertCloseStore" без "CertFreeCertificateContext". В большинстве случаев связь сертификата с ключом в этом случае устанавливается.
С уважением,
Юрий Строжевский
Offline Ильшат Абшарипов  
#14 Оставлено : 28 января 2008 г. 20:11:05(UTC)
Ильшат Абшарипов

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

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

Все именно так и делается. С одним отличием: у меня еще импортируются ключи.

У меня весьма похожая схема с одним маленьким отличием: я еще ключи в хранилище добавляю. Вашу схему это слегка модифицирует:
После 1) CertCreateCertificateContext
я делаю следующее:
1.1) открываю нужное мне хранилище CryptAcquireContext
1.2) импортирую ключи в хранилище CryptImportKey

А дальше уже п.п.2 и т.д.
Верно поступаю?
Offline Юрий  
#15 Оставлено : 28 января 2008 г. 23:54:26(UTC)
Юрий

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

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Все верно. Пункт 1.1 получает ссылку на криптопровайдера, 1.2 импортирует ключ в хранилище.
С уважением,
Юрий Строжевский
Offline Ильшат Абшарипов  
#16 Оставлено : 29 января 2008 г. 11:45:36(UTC)
Ильшат Абшарипов

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

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

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