Параметр шаблона в InitializeFromPrivateKey () для объекта CX509CertificateRequestPkcs10 вызывает исключение при попытке конкретного шаблона - PullRequest
4 голосов
/ 05 августа 2011

У меня проблема с указанием параметра шаблона в InitializeFromPrivateKey () для X509Enrollment.CX509CertificateRequestPkcs10 . Все, кроме шаблона «Пользователь» , приводит к следующему исключению: -

CertEnroll :: CX509CertificateRequestPkcs10 :: InitializeFromPrivateKey: запрошенный шаблон сертификата не поддерживается этим CA. 0x80094800 (-2146875392)

Существует определенный шаблон сертификата, который мне нужно использовать, и когда я пробую его, код выдает исключение. Шаблон существует в ЦС и на клиентском компьютере, на котором выполняется следующий код.

Javascript код следующим образом:

 <script type="text/javascript">

     var sCertificate = null;
     var sDistinguishedName = "C=\"\";S=\"\";L=\"\";O=\"XXXXX\";OU=\"XXXXXXX\";E=\"XXXXX@XXXX.com\";CN=\"xxxxxxx\";";
     var template = "RegistrationCert"; //Anything Other than "User" fails, have tried template Oid too.

     var classFactory = new ActiveXObject("X509Enrollment.CX509EnrollmentWebClassFactory");
     var objEnroll = classFactory.CreateObject("X509Enrollment.CX509Enrollment");
     var objPrivateKey = classFactory.CreateObject("X509Enrollment.CX509PrivateKey");
     var objRequest = classFactory.CreateObject("X509Enrollment.CX509CertificateRequestPkcs10");
     var objDN = classFactory.CreateObject("X509Enrollment.CX500DistinguishedName");

     objPrivateKey.ProviderName = "Microsoft Enhanced Cryptographic Provider v1.0";
     objPrivateKey.KeySpec = "1";
     objPrivateKey.ProviderType = "1";

    try 
    {
            objRequest.InitializeFromPrivateKey(1, objPrivateKey, template);
            objDN.Encode(sDistinguishedName, 0);
            objRequest.Subject = objDN;
            objEnroll.InitializeFromRequest(objRequest);
            sCertificate = objEnroll.CreateRequest(1);
            document.writeln(sCertificate);
    }
    catch (ex)
    {
             document.writeln(ex.description);
    }
 </script>

Пара других вопросов
- Я предполагаю, что шаблон должен существовать на клиентском компьютере? Иначе как он узнает местоположение CA для запроса шаблонов?
- Работает ли CertEnroll на клиенте даже с сервером Windows 2003 CA ??

Если вы можете мне помочь, это будет высоко ценится !!!

Дополнительная информация
- Клиент - Windows 7, с клиентом MS IE9, работающим от имени администратора.
- Доступ к веб-приложению, на котором расположена указанная выше страница, осуществляется через HTTP.
- Веб-приложение размещено на CA Server Win2003.

Перед публикацией я посмотрел ...
- потоки Stackoverflow относительно CertEnroll + InitializeFromPrivateKey
- Блоги об использовании OID шаблона, а не имени шаблона
- MSDN / Сайт Алеякмы
- CertEnroll API на MSDN

Ответы [ 2 ]

5 голосов
/ 06 августа 2011

Ладно, так и подумал .. нетипично.

  • Используйте CX509ExtensionTemplateName и вызывайте InitializeEncode со значением шаблона OID
  • Не указывать параметр шаблона в InitializeFromPrivateKey .

т.е:

var objExtensionTemplate = classFactory.CreateObject("X509Enrollment.CX509ExtensionTemplateName")


objRequest.InitializeFromPrivateKey(1, objPrivateKey, ""); //empty string, don't specify template here
objExtensionTemplate.InitializeEncode(template); //Specify Template as OID value!
objRequest.X509Extensions.Add(objExtensionTemplate);

Проверил в ЦС, что запрос относится к указанному мною типу шаблона, и действительно создает только сертификат для этого типа.

Надеюсь, это поможет кому-нибудь однажды.

1 голос
/ 04 июля 2014

Смотрите также этот код, где я использую более новую DLL, которая не включает методы, которые вы используете. Я также не использую "типы взаимодействия" , которые вызывают проблемы при развертывании или сборке кода.

 CObjectId EkuOid = new CObjectId();
        EkuOid.InitializeFromValue("1.3.6.1.4.1.311.21.8.4946465.16405226.12930948.10533807.2139545.33.5005369.11644649");
        CObjectIds EkuOids = new CObjectIds();
        EkuOids.Add(EkuOid);
        CX509ExtensionEnhancedKeyUsage eku = new CX509ExtensionEnhancedKeyUsage();
        eku.InitializeEncode(EkuOids);
        eku.Critical = false;
        objPkcs10.X509Extensions.Add((CX509Extension)eku);

OID может быть получен с помощью этого метода на serverfault

Альтернативные реализации этого кода (VBS, C # и т. Д.) находится здесь.

...