IIS中的TLS相互身份验证,无需重新协商

时间:2013-04-10 13:55:37

标签: windows iis ssl

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

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

由于以下原因,这是不可接受的:

  1. 请求不是通过双向认证的TLS连接发送的。
  2. 这无缘无故地增加了额外的TLS会话协商。
  3. 验证使用双向身份验证很困难,因为双向身份验证的握手消息在初始单向身份验证会话中加密
  4. TLS会话重新协商存在与之关联的安全漏洞,除非您正确执行此操作。
  5. 我的猜测是IIS需要知道您尝试访问哪个网站才能应用适当的SSL设置,因此它以“默认”单向认证会话开始,并在收到请求后确定它需要使用双向身份验证。由于我在IIS上托管的所有内容都需要双向身份验证,因此我希望这是“默认”行为。有没有办法编写Web应用程序或配置IIS(或Windows Server 2012)始终以双向认证的TLS会话开始?

2 个答案:

答案 0 :(得分:2)

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

对于IIS 7:

将以下文本保存到名为“Enable_SSL_Renegotiate_Workaround.js”的文件中

var vdirObj = GetObject(“IIS:// localhost / W3svc / 1”); //将此行上的1替换为您要配置的网站编号

WScript.Echo(“SSLAlwaysNegoClientCert之前的值:”+ vdirObj.SSLAlwaysNegoClientCert); vdirObj.Put(“SSLAlwaysNegoClientCert”,true); vdirObj.SetInfo(); WScript.Echo(“SSLAlwaysNegoClientCert之后的值:”+ vdirObj.SSLAlwaysNegoClientCert);

从提升/管理员命令提示符运行以下命令:

cscript.exe enable_ssl_renegotiate_workaround.js

答案 1 :(得分:0)

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