1

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

对于 Vista 和 7,Microsoft 用新的 CertEnroll 控件替换了 XenRoll ActiveX 控件。我在 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 中得到这个工作?

4

2 回答 2

2

解决方案是安装修补程序 KB 2078942

请注意,此修补程序并未声称可以解决此问题,但确实可以!相当烦人,否则我会更早遇到它:-/

我相信这是来自 Vista 的回归错误,因为 Vista 有一个修补程序来修复我遇到的确切问题。

感谢布鲁诺昨天花时间帮助我解决这个问题。

于 2010-09-03T14:31:06.027 回答
1

不久前我写了这个脚本来做一个演示(与这个页面一起)。它支持并用 Internet Explorer 上的XEnrollCertEnroll调用<keygen/>替换它。从那以后,该项目发生了一些变化,但我刚刚在 Windows 7 上使用 IE8 测试了这个分支并且它工作正常。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.");
    }
}

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

于 2010-09-02T16:25:06.587 回答