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