我正在尝试将IIS网站配置为需要SSL客户端证书。该网站在IIS 6和7中都设置了,虽然我更感兴趣的是它使它适用于7.我在IIS中设置了require客户端证书属性,它通过Web浏览器访问网站时工作正常,但是Java-基于客户端无法访问它。
我认为问题是IIS在初始SSL握手期间没有请求客户端证书。相反,它会协商正常的SSL连接,检查资源是否需要客户端证书,如果是,则启动请求客户端证书的新SSL握手。 IIS执行此操作以支持仅需要某些资源的客户端证书的站点。即使为整个网站指定了要求,IIS仍会启动两次SSL握手。我想强制IIS在第一次SSL握手时请求客户端证书,这有望使客户端正常工作。 (客户端由外部合作伙伴开发,我几乎不了解它是如何设置的,也无法访问其源代码)
之前有没有人在IIS中处理过这个问题?
答案 0 :(得分:10)
以下是我在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很重要的原因,因此它知道要重新添加什么。)
运行该批处理文件,检查是否有错误,已完成。
请注意,此设置是应用 per-certificate ,而非每服务器。因此,如果您使用多个证书,或更改/更新您的证书,则必须再次执行此操作。
答案 1 :(得分:7)
我花了一些时间才找到此配置数据库设置。我们的客户使用新的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
(来自KB文章977377)