3

我正在托管一个 Web 应用程序,该应用程序使用 TLS 和双向(2 路)身份验证进行所有连接。我的 Web 应用程序在 Windows Server 2012 上使用 IIS 8 托管,并且在 IIS 中配置为需要 SSL 并且还需要客户端证书。当我从浏览器访问 Web 应用程序时,系统会提示我输入证书,一切似乎都很好。

但是,当我查看数据包捕获时,我看到 TLS 会话以单向身份验证会话开始,然后发送请求,然后将会话重新协商为 2 向身份验证会话,然后响应是在此 2 向身份验证会话中发送。

这是不可接受的,原因如下:

  1. 请求不是通过 2-way 认证的 TLS 连接发送的。
  2. 这无缘无故地增加了额外的 TLS 会话协商。
  3. 验证是否使用了 2-way 身份验证很困难,因为 2-way 身份验证的握手消息在初始 1-way 身份验证会话中被加密
  4. 除非您正确执行,否则 TLS 会话重新协商具有与之相关的安全漏洞。

我的猜测是 IIS 需要知道您正在尝试访问哪个站点才能应用适当的 SSL 设置,因此它以“默认”单向身份验证会话开始,并在收到请求后确定它需要使用 2 向身份验证。由于我在 IIS 上托管的所有内容都需要双向身份验证,因此我希望这是“默认”行为。是否有某种方法可以对 Web 应用程序进行编码或将 IIS(或 Windows Server 2012)配置为始终以 2 路身份验证的 TLS 会话开始?

4

2 回答 2

4

在http://technet.microsoft.com/en-us/security/bulletin/MS10-049找到了答案。它没有列出 IIS 8,但 IIS 7 的修复似乎有效:

对于 IIS 7:

将以下文本保存到名为Enable_SSL_Renegotiate_Workaround.js

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

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

于 2013-11-06T21:53:59.380 回答
1

juhraffe 的答案确实有效,但也让我发现了一个看起来更干净的以下解决方案。

在我们的部署过程中,我们使用网络配置实用程序将证书绑定到端口

netsh http add sslcert ipport=0.0.0.0:443 certhash=f882031933dc66a88993d5b5c326ed21b2ea8779 appid={4dc3e166-e14b-4a21-b022-59fc669b0914} 

显然,可以添加一个额外的标志,它可以达到与 juhraffe 解决方案中描述的相同的效果

所以这就是我们修改命令的方式

netsh http add sslcert ipport=0.0.0.0:443 certhash=f882031933dc66a88993d5b5c326ed21b2ea8779 appid={4dc3e166-e14b-4a21-b022-59fc669b0914} clientcertnegotiation=enable
于 2016-06-10T13:55:27.667 回答