1

我们有一个现有的证书颁发应用程序(C#,ASP.NET,JavaScript),它向在IE中使用XenRoll的Windows XP用户颁发证书。我需要扩展它以支持Windows Vista和Windows 7用户,也使用IE。无法使用CertEnroll在Windows 7上安装证书

对于Vista和7,Microsoft使用新的CertEnroll控件替换了XenRoll ActiveX控件1。我有在Vista SP2这个工作,但在我7在安装步骤得到这个错误:

CertEnroll :: CX509Enrollment :: InstallResponse: 证书链处理,但终止于根证书 这信任提供者不信任 。 0x800b0109(-2146762487)

下面是有关HTML片段&的JavaScript:

<object id="classFactoryObj" classid="clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"></object> 

<script type="text/javascript"> 
    function InstallCert() 
    { 
     try 
     { 
      var classFactory = document.getElementById("classFactoryObj"); 
      var objEnroll = classFactory.CreateObject("X509Enrollment.CX509Enrollment"); 

      var signedCert = '-----BEGIN CERTIFICATE-----' + 
       'REMOVED FOR BREVITY' + 
       '-----END CERTIFICATE-----'; 

      objEnroll.Initialize(1); // User context 
      objEnroll.InstallResponse(4, signedCert, 6, ""); // AllowUntrustedRoot = 4 

      alert('Certificate installed'); 
     } 
     catch (ex) 
     { 
      alert('Unable to install certificate: ' + ex.description); 
     } 
    } 

    InstallCert(); 
</script> 

现在,它是真实的根证书不被信任,但我打电话InstallResponse与第一参数设置为4,即使根证书不受信任也应允许安装。这在Vista中广告,但在Windows 7似乎并没有。

我测试过,如果根证书是可信的,它确实有效。我确信有人会这样说,所以我会抢先一步 - 让客户信任根证书对我们来说不是一个真正的选择(我们想要将客户端身份验证证书分发给客户,作为验证它们的一部分在我们的网络上)。

我在这里做错了什么?其他人有没有在Windows 7中工作?

回答

2

解决方案是安装hotfix KB 2078942

请注意,此修补程序不声称修复此问题,但它确实!相当annonying,或者我会碰到它早得多: -/

我相信这是从Vista的回归bug,因为有一个hotfix为Vista来解决我遇到的确切问题。

感谢和upvote出去布鲁诺花时间昨天试图帮助我解决这个问题。

1

前一段时间我写了this script进行演示(连同this page)。它支持<keygen/>并将其替换为XEnrollCertEnroll Internet Explorer上的调用。该项目已经发展了一段时间,但是我刚刚在Windows 7上测试了带有IE8的this branch并且它工作正常。 CA证书完全不在客户端机器上。我必须将安全设置降低到“低”才能运行ActiveX(否则,它甚至不会提交请求,所以甚至不需要在响应中安装证书)。

是否有帮助,我这样做:

try { 
    enrollObj.InstallResponse(4, xmlHttpRequest.responseText, 
      0, ""); 
    window.alert("A certificate has been installed."); 
} catch (e1) { 
    try { 
     enrollObj.InstallResponse(0, 
       xmlHttpRequest.responseText, 0, ""); 
     window.alert("A certificate has been installed."); 
    } catch (e2) { 
     window 
       .alert("You're probably using Vista without SP1 or above, in which case you need to add the certificate of this authority as a trusted root certificate."); 
    } 
} 

我必须承认,我没有测试它的这两种情况下使用(因为它是相同的警报消息)。

+0

我对ActiveX设置没有问题 - 如果您通过HTTPS运行CertEnroll,您将无法获得该设置。 – Cocowalla 2010-09-02 16:32:20

+0

的确,我今天只是在一个简单的HTTP测试服务器上运行它。 – Bruno 2010-09-02 16:36:34

+0

我刚刚检查过,它是第一个为我工作的'enrollObj.InstallResponse(4,xmlHttpRequest.responseText,0,“”);'也许在初始化的其余部分有其他内容。 (对不起,我现在不记得所有的细节。) – Bruno 2010-09-02 16:40:29