10.05.2007 12:47:59Как определить тип ключа Ответов: 8
Алексей П.
Как определить тип ключа из сертификата(создается с помощью CertCreateCertificateContext()) или провайдера?
CryptSignHash требует явного указания AT_KEYEXCHANGE или AT_SIGNATURE.
Если провайдер получается с помощью CryptAcquireCertificatePrivateKey, то
тип ключа возвращается, если с помощью CryptAcquireContext, то нет.
 
Ответы:
10.05.2007 13:41:06Kirill Sobolev
Все логично.
Как у Вас получается такая ситуация? В общем случае ничего определять не надо.
Если Вы делаете подпись, то берете сертификат из хранилища, в нем есть ссылка в которой указано, на какой ключ ссылается сертификат.
Если же у Вас сертификат из файла или еще откуда-то без привязки к ключу, значит Вы не сможете открыть контейнер ни при помощи CryptAcquireCertificatePrivateKey, ни при помощи CryptAcquireContext. Вопрос - откуда берется информация о контейнере?
10.05.2007 13:52:22Алексей П.
В базе хранятся сертификаты и может храниться еще имя ключевого контейнера для каждого сертификата.
Сертификаты читаются из базы и создаются с помощью CertCreateCertificateContext().
При подписи, если контейнер не указан, считаю, что в системе есть связь сертификата и закрытого ключа и использую CryptAcquireCertificatePrivateKey. Если имя контейнера указано, то использую CryptAcquireContext(). При этом сам сертификат может быть не зарегистрирован в системе. Все работает вроде нормально, только проблема с определением типа ключа
10.05.2007 14:07:53Василий
На практике, для пользовательских сертификатов и ключей, в 99% случаев используется AT_KEYEXCHANGE (который используется и для подписи, и для обмена ключами при шифровании).
10.05.2007 14:43:17Kirill Sobolev
Сделайте отдельное поле типа ключа в базе и при добавлении контейнера добавляйте и тип тоже.
Можно сначала смотреть, какой ключ есть в контейнере - подписи или обмена. Если есть оба - то уже смотреть по ОК из сертификата.
10.05.2007 14:53:59Алексей П.
А как определить какой ключ есть в контейнере - подписи или обмена? И как смотреть по ОК из сертификата?
10.05.2007 15:16:46Василий
> А как определить какой ключ есть в контейнере - подписи или обмена?

Странный вопрос - вызвать CryptGetUserKey по очереди на оба типа ключа.
10.05.2007 16:07:15Kirill Sobolev
Необязательно или, могут быть 2 ключа сразу - и подписи, и обмена. Какой Вам нужен можно определить сравнением ОК из сертификата, с тем который можно получить из контейнера.
10.05.2007 16:59:53Алексей П.
Понятно. Спасибо всем.