我在X509Enrollment.CX509CertificateRequestPkcs10对象的InitializeFromPrivateKey()中指定模板参数时遇到问题。除了“用户”模板之外的任何内容都会导致以下异常:-
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 客户端以管理员身份运行。
- 通过 HTTPs 访问托管上述页面的 Web 应用程序。
- Web 应用程序托管在 Win2003 CA 服务器上。
在发布之前,我查看了...
- 关于 CertEnroll + InitializeFromPrivateKey 的 Stackoverflow 线程
-关于使用模板 OID 而不是模板名称的博客
- MSDN / alejacma 的站点
- MSDN 上的 CertEnroll API