【问题标题】:Make IIS require SSL client certificate during initial handshake使 IIS 在初始握手期间需要 SSL 客户端证书
【发布时间】:2011-01-31 21:03:29
【问题描述】:

我正在尝试将 IIS 网站配置为需要 SSL 客户端证书。该网站是在 IIS 6 和 7 中设置的,尽管我更感兴趣的是让它在 7 中工作。我在 IIS 中设置了需要客户端证书属性,它在通过 Web 浏览器访问网站时工作正常,但是 Java-基于客户端的客户端无法访问它。

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

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

【问题讨论】:

  • 您可能想在 serverfault.com 上尝试这个问题

标签: iis ssl client-certificates


【解决方案1】:

这是我在 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. 使用该信息创建一个批处理文件:

    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 很重要,因此它知道要重新添加什么。)

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

请记住,此设置适用于每个证书,而不是每个服务器。因此,如果您使用多个证书,或更改/更新您的证书,您将不得不再次执行此操作。

【讨论】:

  • 每个 netsh 命令之间应该有换行符。我不记得我从哪里得到这个 - KB? MSDN?
  • 其次,这适用于 Windows 2008 R2 上的 IIS 7.5。
【解决方案2】:

我花了一段时间才找到这个元数据库设置。我们的客户使用新的 certicom 库时遇到了同样的问题。自从发现围绕 SSL 重新协商的 MITM 攻击以来,很多圈子的答案都是挂断重新协商请求。

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

对于 IIS 6: cscript adsutil.vbs 设置 \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 的知识库文章)

【讨论】:

  • 嗯,它不喜欢我输入的方式... generic cscript adsutil.vbs \w3svc\siteID\SSLAlwaysNegoClientCert 默认网站为真(示例) cscript adsutil.vbs \w3svc\1\SSLAlwaysNegoClientCert是的
  • 这在 IIS 7 中有效吗?我记得找到 SSLAlwaysNegoClientCert 但我无法弄清楚如何在 IIS 7 中设置它。我最近找到了这个解释:forums.iis.net/t/1158990.aspx。最后,我们决定采用不同的方式进行客户端身份验证,所以我的兴趣只是出于好奇。谢谢你的回答。
  • 是的,我们的安装文档已经推荐了 IIS 6 兼容性组件。于是,我轻松下车。不过,你的问题可能让我在星期一省了一个咀嚼的流浪汉。我没有检查 adsutil 是否是 IIS 6 可战斗性组件的一部分。我现在有太多太多的事情要担心了。
猜你喜欢
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2018-05-15
  • 1970-01-01
相关资源
最近更新 更多