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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Spark  
#1 Оставлено : 7 ноября 2012 г. 0:46:52(UTC)
Spark

Статус: Новичок

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

Доброе время суток!

Имеем сертификат в хранилище на компьютере. Ссылки на контейнер с закрытым ключом у сертификата нет. Сертификата внутри самого контейнера нет.
Стоит задача привязать сертификат к контейнеру. Использую для этого функцию CertSetCertificateContextProperty(,CERT_KEY_PROV_INFO_PROP_ID,). Как известно, нужно заполнить структуру

struct _CRYPT_KEY_PROV_INFO

где указать

LPWSTR pwszContainerName; - имя контейнера
LPWSTR pwszProvName; - имя провайдера

Если всё указать явно (оба имени), то все замечательно привязывается. Если же присвоить этим полям NULL,

pwszContainerName = NULL;
pwszProvName = NULL;

То привязка тоже срабатывает. Сначала думал, что провайдер берёт первый попавшийся контейнер и проставляет на него ссылку. Но как показала практика - это не так. Контейнеров у меня много, но привязка делается безошибочно к нужному.
В связи с этим встает вопрос - обязательно ли всегда явно задавать имя провайдера и контейнера? Корретно ли будет ничего не указывать и при этом всегда рассчитывать на правильную привязку? Или может быть это работает только в случае с Крипто Про?
Offline cybermerlin  
#2 Оставлено : 9 ноября 2012 г. 22:13:59(UTC)
cybermerlin

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

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

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 3 раз в 3 постах
пробовали привязать сертификат к чужому контейнеру? :)
Offline Максим Коллегин  
#3 Оставлено : 9 ноября 2012 г. 22:28:56(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 38 раз
Поблагодарили: 734 раз в 632 постах
Нужно указывать оба имени, иначе будет привязка к дефолтному контейнеру дефолтного провайдера типа.
Знания в базе знаний, поддержка в центре поддержки
Offline Spark  
#4 Оставлено : 12 ноября 2012 г. 14:08:01(UTC)
Spark

Статус: Новичок

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

cybermerlin написал:
пробовали привязать сертификат к чужому контейнеру? :)


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

maxdm написал:
Нужно указывать оба имени, иначе будет привязка к дефолтному контейнеру дефолтного провайдера типа.

Как ни странно дефолтная привязка в моем случае срабатывает всегда правильно. И это несмотря на приличное количество контейнеров в системе.
Я думал, что криптопровайдер, если не указывать контейнер, сам проверяет соответствие сертификата всем установленным в системе контейнерам и устанавливает правильную привязку. Впрочем, теперь я понял, что гарантий здесь никаких нет.

Offline vuan  
#5 Оставлено : 28 декабря 2012 г. 7:34:51(UTC)
vuan

Статус: Новичок

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

Сказал(а) «Спасибо»: 3 раз
пишу прогу на бейсике, объявил структуру:

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
Public Structure CRYPT_KEY_PROV_INFO
<MarshalAs(UnmanagedType.LPWStr)> _
Public pwszContainerName As String
<MarshalAs(UnmanagedType.LPWStr)> _
Public pwszProvName As String
Public dwProvType As Int32
Public dwFlags As Int32
Public cProvParam As Int32
Public rgProvParam As CAPICOM._CRYPT_KEY_PROV_PARAM
Public dwKeySpec As Int32
End Structure

pwszContainerName - я так понял, имя контейнера, и должно содержать значение наподобе "29565aa2-5b4d-499e-b349-2439c4f305a4"

что тогда есть pwszProvName? ясно, что это имя провайдера, какое тут должно быть значение тогда?
Offline Андрей Писарев  
#6 Оставлено : 28 декабря 2012 г. 7:42:12(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,022
Мужчина
Российская Федерация

Сказал «Спасибо»: 609 раз
Поблагодарили: 2364 раз в 1860 постах
Можно посмотреть в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\
или запросить список через CryptoAPI.
Для КриптоПРО: Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider
dwProvType = 75
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
vuan оставлено 29.12.2012(UTC)
Offline vuan  
#7 Оставлено : 29 декабря 2012 г. 8:13:20(UTC)
vuan

Статус: Новичок

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

Сказал(а) «Спасибо»: 3 раз
ага, ясно, маленький вопрос:
что должна содержать переменная типа PCCERT_CONTEXT? точнее, как ей присвоить контекстк сертификата? (Язык - С++)
Offline Андрей Писарев  
#8 Оставлено : 29 декабря 2012 г. 11:25:34(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,022
Мужчина
Российская Федерация

Сказал «Спасибо»: 609 раз
Поблагодарили: 2364 раз в 1860 постах
Автор: vuan Перейти к цитате
ага, ясно, маленький вопрос:
что должна содержать переменная типа PCCERT_CONTEXT? точнее, как ей присвоить контекстк сертификата? (Язык - С++)



MSDN CERT_CONTEXT structure
MSDN CertCreateCertificateContext function c примером на С++


p.s. link и по ссылкам на MSDN можно найти все необходимые функции и структуры

Отредактировано пользователем 29 декабря 2012 г. 11:36:39(UTC)  | Причина: ссылка

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