javascript - CX509CertificateRequestPkcs10 对象上的 InitializeFromPrivateKey() 中的模板参数在尝试特定模板时导致异常

标签 javascript templates certificate certificate-authority certenroll

我在 X509Enrollment.CX509CertificateRequestPkcs10 对象的 InitializeFromPrivateKey() 中指定模板参数时遇到问题。 "User" 模板以外的任何内容都会导致以下异常:-

CertEnroll::CX509CertificateRequestPkcs10::InitializeFromPrivateKey:此 CA 不支持请求的证书模板。 0x80094800 (-2146875392)

我需要使用一个特定的证书模板,当我尝试使用它时,代码会抛出异常。该模板存在于 CA 和运行以下代码的客户端计算机上。

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 客户端。
- 托管上述页面的 Web 应用程序通过 HTTPs 访问。
- Web 应用程序托管在 Win2003 CA 服务器上。

在发布之前,我已经查看了...
- 关于 CertEnroll + InitializeFromPrivateKey
的 Stackoverflow 线程 - Blogs about using Template OID not Template name
- MSDN / alejacma's Site
- MSDN 上的 CertEnroll API

最佳答案

好吧,这么想……很典型。

  • 使用 CX509ExtensionTemplateName,并使用 OID 模板值调用 InitializeEncode
  • 不要在 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);

已在 CA 上验证该请求是针对我指定的模板类型的,并且确实只为该类型创建了一个证书。

希望有一天这对某人有所帮助。

关于javascript - CX509CertificateRequestPkcs10 对象上的 InitializeFromPrivateKey() 中的模板参数在尝试特定模板时导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6959128/

相关文章:

javascript - 如何在不知道首先执行哪个 then() 的情况下返回已解决的 promise

javascript - 可以改进这种带有 "object"的类型检查吗?

javascript - HTML/CSS/JS 初学者错误

python - 在主目录中安装 cheetah

C++ 错误 : operator[] cannot be overloaded

c++ - 使用 `const&` 调用模板?

python - 线程中的for循环在Python 3中运行一次

ssl - 使用 Kohana 验证 SSL 证书失败

javascript - 多个异步回调 javascript 如何解决这个问题?

http - 使用 ikeyman 生成 SHA-2 证书