| ||||
| ||||
Добрый день! Нужна помощь, подскажите пожалуйста! Производится действие по добавления заявки на сертификат. Dim CertEnroll As XENROLLLib.CEnroll Dim sPKCS7 CertEnroll = New XENROLLLib.CEnroll Dim RequestStr As String Dim Disposition Dim ID As Integer Dim CertRequest As CERTCLIENTLib.CCertRequest CertEnroll.ProviderName = "Microsoft Enhanced Cryptographic Provider v1.0" Dim strDN As String strDN = "CN=" & Name strDN = strDN & ",O=" & Org strDN = strDN & ",OU=" & OrgUnit strDN = strDN & ",L=" & Locality strDN = strDN & ",S=" & State strDN = strDN & ",E=" & Email RequestStr = CertEnroll.createRequest(XECR_CMC, strDN, "1.3.6.1.5.5.7.3.2") CertRequest = New CERTCLIENTLib.CCertRequest Disposition = CertRequest.Submit( _ CR_IN_ENCODEANY Or CR_IN_FORMATANY, _ RequestStr, _ "", _ "xxx\xxx") ID = CertRequest.GetRequestId После того, как администратор подтвердит и выпустит сертификат его требуется установить у клиента. Я пытался сделать так: Dim sCertificate sCertificate = CertRequest.GetCACertificate(False, "xxx\xxx", CR_OUT_BASE64HEADER Or CR_OUT_CHAIN) CertEnroll.DeleteRequestCert = False но получаю ошибку: Объект или свойство не найдено. (Исключение из HRESULT: 0x80092004) Помогите решить проблему. Большое спасибо! CertEnroll.acceptPKCS7(sCertificate) Сервер сертификации (Certification Authority Microsoft Corporation Version: 5.2.3790.3959) находится на машине под win server 2003 SP2 | ||||
Ответы: | ||||
| ||||
Для получения выпущенного пользовательского сертификата надо использовать метод GetCertificate, GetCACertificate - это метод для получения самого сертификата ЦС. А где ошибка то возникает? | ||||
| ||||
Добрый день! Ошибка в строке CertEnroll.acceptPKCS7(sCertificate) Объект или свойство не найдено. (Исключение из HRESULT: 0x80092004) ErrorCode: -2146885628 sCertificate получаю следующим образом. Может быть фотмат CR_OUT_BASE64 не подходящий? sCertificate = CertRequest.GetCACertificate(False, "msk01nfcs028\TestCA", CR_OUT_BASE64) Спасибо! | ||||
| ||||
Метод не подходящий. Я же ответил "Для получения выпущенного пользовательского сертификата надо использовать метод GetCertificate, GetCACertificate - это метод для получения самого сертификата ЦС" | ||||
| ||||
Здравствуйте. 1. Создаю самоподписанный запрос и ключеврой контейнер (CryptoAPI + XEnroll), отправляю его на УЦ -- все ok. 2. Запрос "одабривается". 3. Получаю тело сертификата и вызываю acceptPKCS7() -- ошибка Объект или свойство не найдено. (Exception from HRESULT: 0x80092004) (полученный контент идентичен тому, что получается через web-interface). 4. Когда устанавливаю через web-interface -- все ok. Функция на web-interfac'e вроде бы вызывается та же acceptPKCS7(). Ответьте пожалуйста, в чём может быть проблема? | ||||
| ||||
Когда вызываете acceptPKCS7 - в хранилище Request текущего пользователя есть соответствующий сертификат с ссылкой на ключ? | ||||
| ||||
если имеется ввиду раздел HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\REQUEST, то он пуст. Вопрос в том, что даже если запрос создан не через веб-интерфейс, а программно, то потом, через веб-интерфейс сертификат успешно устанавливается. Но программно, вызывая теже ф-ии, что и в html'нике при установке возникает вышеупомянутая ошибка. | ||||
| ||||
То что он пуст - это неправильно, должен быть сертификат. Видимо у Вас вызываются не те же функции или не в том порядке. | ||||
| ||||
CEnrollClass oEnroll = new CEnrollClass(); oEnroll.ProviderName = CSP; oEnroll.ProviderType = (int)CSPType; oEnroll.KeySpec = (int)AT_KEYEXCHANGE; oEnroll.DeleteRequestCert = 0; oEnroll.WriteCertToCSP = 1; try { oEnroll.acceptPKCS7(PKCS); } Скажите, пожалуйста, в чем ошибка. | ||||
| ||||
Если перед тем как вызывается этот код сертификата в хранилище Request нет - то ошибка не в нем а где-то раньше. | ||||
| ||||
Ветка реестра HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\REQUEST также пуста и после создания запроса через веб-интерфейс (вход по TokenID), однако это не мешает получению сертификата | ||||
| ||||
Вы на ХР/2003 запрос делаете? Посмотрите оснасткой MMC либо в \Documents and Settings\<имя пользователя>\Application Data\Microsoft\SystemCertificates\Request\Certificates | ||||
| ||||
XPsp2. Посмотрел оснастку "Запросы заявок на сертификат\Сертификаты" в обоих случаях запросы помещаются в хранилище. НО в первом случае (когда создаю программно) файл занимает 965 байт, во втором -- 925 байт. (файлы выслал на info@cryptopro.ru с пометкой to Kirill Sobolev (subject: "Установка сертификата")) | ||||
| ||||
Добился идентичности файлов в хранилище (при отправлении самоподписанного запроса), созданных при помощи веб-интерфейса и программно. Разница была в ссылке на CSP. В первом случае использовался "Crypto-Pro GOST R 34.10-2001 KC1 CSP", во втором "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider". Кстати почему веб-интерфейс определил KC1 CSP, программно всегда использую "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider". Не смотря на изменение имени CSP, проблема с ошибкой при вызове acceptPKCS7() осталась. | ||||
| ||||
В программе Вы задаете имя провайдера явно, а в веб-интерфейсе наверное выбрали КС1. А на выпущенный сертификат, который не устанавливается, можно взглянуть? | ||||
| ||||
KC1 выбирается по дефолту (если указать в качестве параметра инициализации NULL) Оба сертификата (с веб-интерфейса и полученный программно, везде KC1) отправил на info@cryptopro.ru | ||||
| ||||
В принципе ошибка не исчезает, если устанавливаю сертификат полученный с w-i: oEnroll.acceptFilePKCS7("..\from_web-interface.cer"); | ||||
| ||||
Вообще то у запроса на сертификат и самого сертификата разные субъекты, "ООО "Рога и копыта" (тестовый клиент)" и uc-administrator соответственно. XEnroll не может найти соответствующий сертификату запрос для привязки к контейнеру, поэтому ошибка и возникает. | ||||
| ||||
Почему с web-interfac'a сертификат устанавливается? | ||||
| ||||
Kirill, объясните пожалуйста по-подробнее на счет субъекта uc-administrator. (т.е. УЦ возвращает нет тот сертификат?) | ||||
| ||||
УЦ возвращает тот сертификат, который Вы у него попросите. А вот XEnroll потом ищет запрос в хранилище Request, соответствующий сертификату, который Вы передает в параметре метода acceptPKCS7. В Вашем случае он почему-то отсутствует. Посмотрите, появляется ли он там после того, как отрабатывает программа, которая запрос создает. | ||||
| ||||
Kirill, спасибо (вопросы снимаются) Исправил, все ok ) | ||||