| ||||
| ||||
В данный момент УЦ сохраняет информацию о заказанном сертификате на клиенте в cookies (RequestID). Проблема в том, что есть возможность удалить эти cookies и сертификат забрать уже не получится, хотя УЦ его успешно выпустит. Вопрос: Есть ли способ идентифицировать запрос не по cookies а по тому ключу, который клиент уже создал у себя на машине ?? Такой способ по моему мнению более надежен. | ||||
Ответы: | ||||
| ||||
Если имеется ввиду Microsoft Certificate Services, то да: Запрос в службу сертификации передается при помощи CCertRequest::Submit. В случае успеха этот метод возвращает число, по которому затем можно получить выданный сертификат методом CCertRequest::GetCertificate | ||||
| ||||
Спасибо! Проблема как раз в том, что нельзя что-либо сохранять на клиенте. Вот если была бы возможность обратится к открытому ключу на клиенте, который должен подписать УЦ... | ||||
| ||||
Готового ничего нет. Можно написать свой код, который будет получать открытый ключ, искать через CCertView сертификат в базе ЦС и возвращать его. | ||||
| ||||
Правильно ли я понял, Кирилл, что существует таки возможность обратиться к открытым ключам, которые клиент успел сгенерить. Если просто смотреть на УЦ, то есть потенциальная возможность забрать "чужой" сертификат. | ||||
| ||||
Если запрос был сделан при помощи XEnroll, то он будет лежать в хранилище Request, вернее не он сам а неподписанный сертификат, который по этому запросу может быть выдан (т.е. открытый ключ уж точно тот же самый). Забрать конечно можно, но для этого должны совпасть открытые ключи - чего быть не должно. | ||||
| ||||
Очень хорошо! Теперь проблема в другом. Как при наличии открытого ключа, полученного от клиента, сказать серверу отдать именно этот сертифкат. В текущий момент это делается по RequestID. Единственный выход - это найти по Public Key RequestID и выполнить стандартную процедуру. Я правильно понимаю ?? | ||||
| ||||
Да, все верно. Но что бы не усложнять можно сразу отдать найденный сертификат. | ||||
| ||||
Огромное спасибо Вам, Кирилл! Последний вопрос: Как я могу на КЛИЕНТЕ обратиться к хранилищу Request и вытащить необходимую мне информацию?? И что делать если в этом хранилище лежат запросы на другие УЦ ? | ||||
| ||||
Точно так же, как и к другим хранилищам сертификатов. Отличий в плане УЦ у них к сожалению нет, так что нужно искать другой способ различать эти сертификаты. Вообще немного непонятна схема в целом - кто и зачем будет получать выпущенные сертификаты по открытому ключу. | ||||
| ||||
Это надо для того, чтобы избавится от проверки готовности по cookies. Могут быть ситуации, что Cookies на стороне клиента либо не сохранились, либо их подтерли... Мало ли что... Если же проверять по Public Key, тогда эта проблема отпадает. А если и JavaScript будет отключен - то это в клинику :) | ||||
| ||||
Значит надо дать пользователю возможность выбирать из возможных вариантов | ||||
| ||||
Если запрос был сделан при помощи 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() Но сертификаты так и не отображаются. Помогите пожалуйста | ||||
| ||||
Так коллекция oStoreCerts не заполнена, надо сделать что-нибудь типа Set oStoreCerts = oStore.Certificates | ||||
| ||||
Спасибо. Вот только проблема - в хранилище Request лежат все запросы, когда либо создаваемые на этой машине. Можно ли отсеять сертификаты по серверу сертификации, на который я отправил запрос ? | ||||
| ||||
Нет, нельзя. И там лежат не все запросы,а только те которые были созданы текущим пользователем (если смотреть HKCU) | ||||
| ||||
Спасибо! Буду искать другой путь ;) | ||||