使 IIS 在初始握手期间需要 SSL 客户端证书
-
22-09-2019 - |
题
我正在尝试将 IIS 网站配置为需要 SSL 客户端证书。该网站在 IIS 6 和 7 中建立,但我更感兴趣的是使其适用于 7。我在 IIS 中设置了需要客户端证书属性,通过 Web 浏览器访问该站点时它工作正常,但基于 Java 的客户端访问它时遇到问题。
我认为问题在于 IIS 在初始 SSL 握手期间不会请求客户端证书。相反,它会协商正常的 SSL 连接,检查资源是否需要客户端证书,如果需要,则启动请求客户端证书的新 SSL 握手。IIS 这样做是为了支持仅需要某些资源的客户端证书的站点。即使为整个网站指定了要求,IIS 仍会发起两次 SSL 握手。我想强制 IIS 在第一次 SSL 握手时请求客户端证书,这有望让客户端正常工作。(该客户端是由外部合作伙伴开发的,我几乎不知道它是如何设置的,也无法访问其源代码)
有人在 IIS 中处理过这个问题吗?
解决方案
我花了一段时间来找到这个数据库设置。当我们正在使用新的Certicom库我们的客户同样的问题。由于MITM攻击的发现以防万一SSL重新协商,在圈子里的很多答案一直挂机上renegotitation请求。
运行从\的Inetpub \ adminscripts将迫使IIS总是请求客户机证书。
下面CMD有关IIS 6: CSCRIPT ADSUTIL.VBS组\ W3SVC \的siteID \ SSLAlwaysNegoClientCert真
(因此对于缺省的网站,CSCRIPT ADSUTIL.VBS设置\ W3SVC \ 1 \ SSLAlwaysNegoClientCert真)
请记住,有些客户的的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 KB文章)
其他提示
以下是我在 IIS 7.5 上执行此操作的方法:
- 在管理命令提示符中运行以下命令:
netsh http show sslcert
将输出保存在文本文件中。看起来像这样:
IP:port : 0.0.0.0:443 Certificate Hash : [a hash value] Application ID : {[a GUID]} Certificate Store Name : MY Verify Client Certificate Revocation : Enabled Verify Revocation Using Cached Client Certificate Only : Disabled Usage Check : Enabled Revocation Freshness Time : 0 URL Retrieval Timeout : 0 Ctl Identifier : (null) Ctl Store Name : (null) DS Mapper Usage : Disabled Negotiate Client Certificate : Disabled
使用该信息创建批处理文件:
netsh http show sslcert netsh http delete sslcert ipport=0.0.0.0:443 netsh http add sslcert ipport=0.0.0.0:443 certhash=[your cert hash from above] appid={[your GUID from above]} certstorename=MY verifyclientcertrevocation=enable VerifyRevocationWithCachedClientCertOnly=disable UsageCheck=Enable clientcertnegotiation=enable netsh http show sslcert
(是的,您必须删除并重新添加;您不能只是就地更改 clientcertnegotiation。这就是为什么保存哈希值和 GUID 很重要,这样它就知道要重新添加什么。)
运行该批处理文件,检查是否有任何错误,完成。
请记住,此设置已应用 每个证书, ,不是每个服务器。因此,如果您使用多个证书,或更改/更新您的证书,则必须再次执行此操作。