在初始握手期间,使IIS要求SSL客户端证书

24

我正在尝试配置IIS网站要求SSL客户端证书。该网站在IIS 6和7中都设置了,但我更感兴趣的是使其在IIS 7中工作。我在IIS中设置了要求客户端证书属性,并且通过Web浏览器访问网站时它能正常工作,但基于Java的客户端访问时出现问题。

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

有人曾经遇到过IIS中的这个问题吗?


你可能想在serverfault.com上尝试这个问题。 - Jeff
2个回答

14

这是我在 IIS 7.5 上的操作步骤:

  1. 以管理员权限运行以下命令:netsh http show sslcert
  2. 将输出保存到文本文件中,内容类似于:

    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
    
  3. 使用该信息创建批处理文件:

  4. 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的重要性,以便它知道要重新添加什么。

  5. 运行批处理文件,检查是否有任何错误,完成。

  6. 请记住,此设置是针对每个证书而不是每个服务器应用的。因此,如果您使用多个证书或更改/更新您的证书,则必须再次执行此操作。


这些netsh命令之间应该有换行符。 我记不得我从哪里得到的 - KB?MSDN? - CrazyPyro
同意,这在Windows 2008 R2上的IIS 7.5中有效。 - Christian Davén

7

我花了一些时间才找到这个元数据设置。我们的客户使用新的certicom库时也遇到了同样的问题。自从发现了关于SSL Renegotiation的MITM攻击,许多人的答案是拒绝重新协商请求。

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

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

(因此对于默认网站,cscript adsutil.vbs set \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 KB文章)


1
好的,它不喜欢我输入的方式... 通用 cscript adsutil.vbs \w3svc\siteID\SSLAlwaysNegoClientCert True对于默认网站(例如) cscript adsutil.vbs \w3svc\1\SSLAlwaysNegoClientCert True - Wayne Weeks
这在IIS 7中可行吗?我记得找到了SSLAlwaysNegoClientCert,但我无法弄清楚如何在IIS 7中设置它。最近我发现了这个解释:http://forums.iis.net/t/1158990.aspx。最终,我们决定采用不同的路线进行客户端身份验证,所以我的兴趣只是出于好奇。感谢您的回答。 - nslowes
是的,我们的设置文档已经推荐使用IIS 6兼容性组件。所以,我轻松解决了这个问题。不过你的问题可能会在周一让我避免受到责备。我没有检查adsutil是否是IIS 6兼容性组件的一部分。我已经有太多事情要处理了,现在不用再担心这个了。 - Wayne Weeks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接