在IIS中TLS相互身份validation,无需重新协商

我正在托pipe一个使用TLS和所有连接相互(2路)身份validation的Web应用程序。 我的Web应用程序在Windows Server 2012上与IIS 8一起托pipe,并且在IIS中configuration为需要SSL,并且还需要客户端证书。 当我从浏览器访问Web应用程序时,系统会提示您input证书,并且一切正常。

但是,当我查看数据包捕获时,我发现TLS会话以单向身份validation的会话开始,然后发送请求,然后会话重新协商为双向身份validation的会话,然后响应为在这个双向authentication的会议发送。

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

  1. 该请求不是通过双向authentication的TLS连接发送的。
  2. 这无意中增加了一个额外的TLS会话协商。
  3. validation使用双向authentication是困难的,因为双向authentication握手消息在初始的单向authentication会话内被encryption
  4. TLS会话重新协商有与之相关的安全漏洞,除非您正确执行。

我的猜测是,IIS需要知道你要访问哪个站点,然后才能应用适当的SSL设置,所以它从一个“默认的”单向authentication会话开始,在它收到请求之后,它确定它需要使用双向authentication。 因为我在IIS上托pipe的所有东西都需要双向身份validation,所以我希望这是“默认”行为。 有什么方法可以编写Web应用程序或configurationIIS(或Windows Server 2012)始终以双向authentication的TLS会话开始?

http://technet.microsoft.com/zh-cn/security/bulletin/MS10-049找到答案。 它没有列出IIS 8,但修复IIS 7似乎工作:

对于IIS 7:

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

var vdirObj = GetObject(“IIS:// localhost / W3svc / 1”); //用这个行的数字替换你想要配置的网站号码

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

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

cscript.exe enable_ssl_renegotiate_workaround.js

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