15.10.2005 21:07:55Не использовать Cookie в УЦ Ответов: 16
Андрей
В данный момент УЦ сохраняет информацию о заказанном сертификате на клиенте в cookies (RequestID).
Проблема в том, что есть возможность удалить эти cookies и сертификат забрать уже не получится, хотя УЦ его успешно выпустит.
Вопрос: Есть ли способ идентифицировать запрос не по cookies а по тому ключу, который клиент уже создал у себя на машине ?? Такой способ по моему мнению более надежен.
 
Ответы:
17.10.2005 9:06:10Kirill Sobolev
Если имеется ввиду Microsoft Certificate Services, то да:
Запрос в службу сертификации передается при помощи CCertRequest::Submit. В случае успеха этот метод возвращает число, по которому затем можно получить выданный сертификат методом CCertRequest::GetCertificate
17.10.2005 10:30:45Andrey
Спасибо!
Проблема как раз в том, что нельзя что-либо сохранять на клиенте.
Вот если была бы возможность обратится к открытому ключу на клиенте, который должен подписать УЦ...

17.10.2005 10:38:58Kirill Sobolev
Готового ничего нет.
Можно написать свой код, который будет получать открытый ключ, искать через CCertView сертификат в базе ЦС и возвращать его.
17.10.2005 12:09:06Андрей
Правильно ли я понял, Кирилл, что существует таки возможность обратиться к открытым ключам, которые клиент успел сгенерить.

Если просто смотреть на УЦ, то есть потенциальная возможность забрать "чужой" сертификат.
17.10.2005 12:14:42Kirill Sobolev
Если запрос был сделан при помощи XEnroll, то он будет лежать в хранилище Request, вернее не он сам а неподписанный сертификат, который по этому запросу может быть выдан (т.е. открытый ключ уж точно тот же самый).
Забрать конечно можно, но для этого должны совпасть открытые ключи - чего быть не должно.
17.10.2005 18:04:58Андрей
Очень хорошо!
Теперь проблема в другом. Как при наличии открытого ключа, полученного от клиента, сказать серверу отдать именно этот сертифкат. В текущий момент это делается по RequestID.
Единственный выход - это найти по Public Key RequestID и выполнить стандартную процедуру. Я правильно понимаю ??
18.10.2005 9:36:28Kirill Sobolev
Да, все верно. Но что бы не усложнять можно сразу отдать найденный сертификат.
19.10.2005 12:50:02Андрей
Огромное спасибо Вам, Кирилл!

Последний вопрос: Как я могу на КЛИЕНТЕ обратиться к хранилищу Request и вытащить необходимую мне информацию??
И что делать если в этом хранилище лежат запросы на другие УЦ ?
19.10.2005 13:01:58Kirill Sobolev
Точно так же, как и к другим хранилищам сертификатов. Отличий в плане УЦ у них к сожалению нет, так что нужно искать другой способ различать эти сертификаты. Вообще немного непонятна схема в целом - кто и зачем будет получать выпущенные сертификаты по открытому ключу.
19.10.2005 13:10:35Андрей
Это надо для того, чтобы избавится от проверки готовности по cookies.
Могут быть ситуации, что Cookies на стороне клиента либо не сохранились, либо их подтерли... Мало ли что...
Если же проверять по Public Key, тогда эта проблема отпадает.
А если и JavaScript будет отключен - то это в клинику :)
19.10.2005 13:43:59Kirill Sobolev
Значит надо дать пользователю возможность выбирать из возможных вариантов
19.10.2005 16:40:31Андрей
Если запрос был сделан при помощи XEnroll, то он будет лежать в хранилище Request
Для того, чтобы посмотреть список, я делю так:

Dim oSignedData
Dim oStore
Dim oCerts
Dim oCert
Dim oSignerCert
Dim oSelectedCerts

Const CAPICOM_CURRENT_USER_STORE = 2
Const CAPICOM_MY_STORE = "My"
Const CAPICOM_REQUEST_STORE = "REQUEST"
Const CAPICOM_STORE_OPEN_READ_ONLY = 0
Const CAPICOM_STORE_OPEN_EXISTING_ONLY = 128
Const CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12
Const CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 128
Const CAPICOM_CERT_INFO_SUBJECT_EMAIL_NAME = 2
CONST CAPICOM_CERTIFICATE_FIND_ROOT_NAME = 3
CONST CAPICOM_CERTIFICATE_FIND_ISSUER_NAME = 2
Set oStore = CreateObject("CAPICOM.Store")

Set oCerts = CreateObject("CAPICOM.Certificates")
Set oStoreCerts = CreateObject("CAPICOM.Certificates")
Set oSigner = CreateObject("CAPICOM.Signer")

oStore.Open CAPICOM_CURRENT_USER_STORE, CAPICOM_REQUEST_STORE, CAPICOM_STORE_OPEN_READ_ONLY Or CAPICOM_STORE_OPEN_EXISTING_ONLY

’Filter out certificates that don’t have a key usage of Digital Signature
’Passing in True for the last param to Find also filters out time invalid and revoked certs
’Set oStoreCerts = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_ISSUER_NAME, "EFCA", False)

’Filter out the certificates that don’t have an e-mail address in them
For each oCert in oStoreCerts
’if Len (oCert.GetInfo ( CAPICOM_CERT_INFO_SUBJECT_EMAIL_NAME )) > 0 Then
oCerts.Add oCert
’ End if
Next
set oSelectedCerts = oCerts.Select()


Но сертификаты так и не отображаются.
Помогите пожалуйста
19.10.2005 16:46:15Kirill Sobolev
Так коллекция oStoreCerts не заполнена, надо сделать что-нибудь типа Set oStoreCerts = oStore.Certificates
19.10.2005 17:15:11Андрей
Спасибо.

Вот только проблема - в хранилище Request лежат все запросы, когда либо создаваемые на этой машине. Можно ли отсеять сертификаты по серверу сертификации, на который я отправил запрос ?
19.10.2005 17:31:33Kirill Sobolev
Нет, нельзя. И там лежат не все запросы,а только те которые были созданы текущим пользователем (если смотреть HKCU)
19.10.2005 18:22:25Андрей
Спасибо! Буду искать другой путь ;)