我正在尝试将IIS网站配置为需要SSL客户端证书。该网站同时在IIS 6和7中设置,尽管我对使它适用于7更感兴趣。我在IIS中设置了必需客户端证书属性,当通过Web浏览器访问该网站时,它运行良好,但是使用Java-基于客户端的访问它有麻烦。

我认为问题在于IIS在初始SSL握手期间不请求客户端证书。相反,它协商一个正常的SSL连接,检查该资源是否需要客户端证书,如果需要,则启动一个新的SSL握手请求客户端证书。 IIS这样做是为了支持只需要某些资源的客户端证书的站点。即使为整个网站指定了要求,IIS仍会启动两次SSL握手。我想强制IIS在第一次SSL握手时请求客户端证书,这有望使客户端工作正常。 (客户端是由外部合作伙伴开发的,我几乎不了解其设置方式,也无法访问其源代码)

以前有人在IIS中处理过此问题吗?

最佳答案

我花了一段时间才找到此配置数据库设置。我们的客户使用新的certicom库时遇到了同样的问题。自从发现MITM攻击围绕SSL重新协商以来,很多人的答案一直是放弃重新协商请求。

从\ inetpub \ adminscripts运行以下cmd将强制IIS始终请求客户端证书。

对于IIS 6:
cscript adsutil.vbs设置\ w3svc \ siteID \ SSLAlwaysNegoClientCert True

(因此,对于默认网站,cscript adsutil.vbs设置为\ w3svc \ 1 \ SSLAlwaysNegoClientCert True)

请记住,某些客户端Internet Explorer在接收到该数据包是否需要客户端证书时会提示您提供客户端证书。

对于IIS 7:

将以下文本保存到名为“Enable_SSL_Renegotiate_Workaround.js”的文件中

var vdirObj=GetObject("IIS://localhost/W3svc/1");
// replace 1 on this line with the number of the web site you wish to configure

WScript.Echo("Value of SSLAlwaysNegoClientCert Before: " + vdirObj.SSLAlwaysNegoClientCert);
vdirObj.Put("SSLAlwaysNegoClientCert", true);
vdirObj.SetInfo();
WScript.Echo("Value of SSLAlwaysNegoClientCert After: " + vdirObj.SSLAlwaysNegoClientCert);

在提升的/管理员命令提示符下运行以下命令:

cscript.exe enable_ssl_renegotiate_workaround.js

(摘自用于977377的知识库文章)

关于iis - 在初始握手期间使IIS要求SSL客户端证书,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2518314/

10-16 17:34