17.08.2007 14:23:22Установка сертификата Ответов: 21
Александр
Добрый день!
Нужна помощь, подскажите пожалуйста!
Производится действие по добавления заявки на сертификат.
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
 
Ответы:
17.08.2007 17:08:59Kirill Sobolev
Для получения выпущенного пользовательского сертификата надо использовать метод GetCertificate, GetCACertificate - это метод для получения самого сертификата ЦС. А где ошибка то возникает?
20.08.2007 10:26:22Александр
Добрый день!
Ошибка в строке
CertEnroll.acceptPKCS7(sCertificate)
Объект или свойство не найдено. (Исключение из HRESULT: 0x80092004)
ErrorCode: -2146885628

sCertificate получаю следующим образом. Может быть фотмат CR_OUT_BASE64 не подходящий?
sCertificate = CertRequest.GetCACertificate(False, "msk01nfcs028\TestCA", CR_OUT_BASE64)
Спасибо!
20.08.2007 10:50:54Kirill Sobolev
Метод не подходящий.
Я же ответил "Для получения выпущенного пользовательского сертификата надо использовать метод GetCertificate, GetCACertificate - это метод для получения самого сертификата ЦС"
17.09.2007 13:34:38Александр
Здравствуйте.

1. Создаю самоподписанный запрос и ключеврой контейнер (CryptoAPI + XEnroll), отправляю его на УЦ -- все ok.
2. Запрос "одабривается".
3. Получаю тело сертификата и вызываю acceptPKCS7() -- ошибка Объект или свойство не найдено. (Exception from HRESULT: 0x80092004) (полученный контент идентичен тому, что получается через web-interface).
4. Когда устанавливаю через web-interface -- все ok. Функция на web-interfac'e вроде бы вызывается та же acceptPKCS7().

Ответьте пожалуйста, в чём может быть проблема?
17.09.2007 15:21:16Kirill Sobolev
Когда вызываете acceptPKCS7 - в хранилище Request текущего пользователя есть соответствующий сертификат с ссылкой на ключ?
17.09.2007 15:38:37Александр
если имеется ввиду раздел HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\REQUEST, то он пуст.

Вопрос в том, что даже если запрос создан не через веб-интерфейс, а программно, то потом, через веб-интерфейс сертификат успешно устанавливается. Но программно, вызывая теже ф-ии, что и в html'нике при установке возникает вышеупомянутая ошибка.
17.09.2007 15:48:07Kirill Sobolev
То что он пуст - это неправильно, должен быть сертификат.
Видимо у Вас вызываются не те же функции или не в том порядке.
17.09.2007 15:55:47Александр
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);
}

Скажите, пожалуйста, в чем ошибка.
17.09.2007 16:32:57Kirill Sobolev
Если перед тем как вызывается этот код сертификата в хранилище Request нет - то ошибка не в нем а где-то раньше.
18.09.2007 9:36:05Александр
Ветка реестра HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\REQUEST
также пуста и после создания запроса через веб-интерфейс (вход по TokenID), однако это не мешает получению сертификата
18.09.2007 11:34:54Kirill Sobolev
Вы на ХР/2003 запрос делаете?
Посмотрите оснасткой MMC либо в \Documents and Settings\<имя пользователя>\Application Data\Microsoft\SystemCertificates\Request\Certificates
18.09.2007 12:15:28Александр
XPsp2.
Посмотрел оснастку "Запросы заявок на сертификат\Сертификаты"
в обоих случаях запросы помещаются в хранилище.
НО в первом случае (когда создаю программно) файл занимает 965 байт, во втором -- 925 байт.

(файлы выслал на info@cryptopro.ru с пометкой to Kirill Sobolev (subject: "Установка сертификата"))
18.09.2007 12:40:15Александр
Добился идентичности файлов в хранилище (при отправлении самоподписанного запроса), созданных при помощи веб-интерфейса и программно. Разница была в ссылке на 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() осталась.
18.09.2007 13:48:39Kirill Sobolev
В программе Вы задаете имя провайдера явно, а в веб-интерфейсе наверное выбрали КС1.
А на выпущенный сертификат, который не устанавливается, можно взглянуть?
18.09.2007 14:11:10Александр
KC1 выбирается по дефолту (если указать в качестве параметра инициализации NULL)

Оба сертификата (с веб-интерфейса и полученный программно, везде KC1) отправил на info@cryptopro.ru
18.09.2007 14:26:08Александр
В принципе ошибка не исчезает, если устанавливаю сертификат полученный с w-i:
oEnroll.acceptFilePKCS7("..\from_web-interface.cer");

18.09.2007 14:36:53Kirill Sobolev
Вообще то у запроса на сертификат и самого сертификата разные субъекты, "ООО "Рога и копыта" (тестовый клиент)" и uc-administrator соответственно. XEnroll не может найти соответствующий сертификату запрос для привязки к контейнеру, поэтому ошибка и возникает.
18.09.2007 14:42:15Александр
Почему с web-interfac'a сертификат устанавливается?
18.09.2007 14:59:14Александр
Kirill, объясните пожалуйста по-подробнее на счет субъекта uc-administrator. (т.е. УЦ возвращает нет тот сертификат?)
18.09.2007 15:21:55Kirill Sobolev
УЦ возвращает тот сертификат, который Вы у него попросите.
А вот XEnroll потом ищет запрос в хранилище Request, соответствующий сертификату, который Вы передает в параметре метода acceptPKCS7. В Вашем случае он почему-то отсутствует. Посмотрите, появляется ли он там после того, как отрабатывает программа, которая запрос создает.
18.09.2007 15:22:42Александр
Kirill, спасибо (вопросы снимаются)
Исправил, все ok )