我使用以下方式扫描了服务器的 SSL/TLS 配置https://www.ssllabs.com/ssltest/,并报道Session resumption (caching) No (IDs assigned but not accepted)
我在循环负载均衡器后面使用了 2 个 Azure Web 角色实例。我认为会话恢复中断是因为会话 ID 缓存在一台服务器上,而另一台服务器上没有缓存。
如何配置 IIS 以使用共享缓存(最好是 Redis)作为其会话 ID?
更新:
似乎没有办法共享会话缓存。但是,Windows Server 2012 R2 似乎支持无状态(基于票证)会话http://technet.microsoft.com/en-us/library/hh831771.aspx#BKMK_Changes2012R2。
尝试将 HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\MaximumCacheSize 设置为 0,如http://technet.microsoft.com/en-us/library/dn786418.aspx#BKMK_SchannelTR_IssuerCacheSize禁用会话缓存,但没有效果。
尝试使用 New-TlsSessionTicketKey 和 Enable-TlsSessionTicketKey 启用基于票证的会话(http://technet.microsoft.com/en-us/library/dn296629.aspx),但同样没有效果。
有人设法使这些设置正常工作吗?
更新 2:
通过设置两者成功禁用会话缓存
- HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\MaximumCacheSize 设置为 0
- HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\ServerCacheTime 设置为 0
并重新启动服务器
IIS AppPool\{app pool GUID}
尽管运行了 Enable-TlsSessionTicketKey 命令,仍然无法使票证生效Network Service
答案1
最后,找到了在 win2k12 r2 和 win2k16 上启用 TLS 会话票证的方法。您需要遵循以下步骤:
在注册表中创建一个键 (
DWORD
),其值为 1HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\EnableSslSessionTicket
通过此 powershell 命令创建一个新的 TLS 会话票证密钥:
New-TlsSessionTicketKey -Password <password> -Path "C:\KeyConfig\TlsSessionTicketKey.config" -ServiceAccountName "System" https://technet.microsoft.com/en-us/itpro/powershell/windows/tls/new-tlssessionticketkey
通过此 powershell 命令启用 TLS 会话票证密钥:
Enable-TlsSessionTicketKey -Password <password> -Path "C:\KeyConfig\TlsSessionTicketKey.config" -ServiceAccountName "System" https://technet.microsoft.com/en-us/itpro/powershell/windows/tls/enable-tlssessionticketkey
重新启动服务器以启用 TLS 会话票证生成。需要重新启动才能使注册表项生效。
重要提示:若要在负载平衡服务器之间重复使用相同的 TLS 会话票证,您需要复制在其中一台服务器上C:\KeyConfig\TlsSessionTicketKey.config
运行“”命令后生成的“”文件,然后将配置文件复制到所有剩余服务器上,并在每个文件上运行“”powershell 命令。不幸的是,这只在 win2k16 上有效。它在 win2k12r2 上不起作用。New-TlsSessionTicketKey
Enable-TlsSessionTicketKey
答案2
对于涉及哪个会话可能存在一些误解。
您拥有大多数 Web 应用程序用来在多个 HTTP 请求之间创建持久性的会话,即您的购物车的典型内容。 这不是 SSLLabs 正在测试的内容。
无论如何:当使用负载均衡器时,您通常应该复制该会话状态,以便当后续 HTTP 请求分发到不同的后端 Web 服务器时,您的访问者不会得到空的购物车。
还有 SSL/TLS 会话,这是 SSLLabs 正在测试的。
简而言之,建立 SSL 连接时,Web 服务器和浏览器首先使用计算成本相对较高的公钥握手/协商(Diffie-Hellman)。协商的一部分是建立一个对称密钥,该密钥对于该特定连接是唯一的,将用于随后通过该连接传输的数据的加密/解密。对称加密仍然是安全的,但计算成本相对较低,因此可以减少 Web 服务器和 Web 浏览器的负载。与纯 HTTP 不同,Web 浏览器将保持与 Web 服务器的 HTTPS 连接打开并将其用于多个 HTTPS 请求,但在空闲一段时间后,连接仍将关闭。
这就是 SSL 会话缓存发挥作用的地方。如果启用,Web 服务器可能会允许 Web 浏览器在新连接上重新使用旧的对称密钥,而不是协商新的对称密钥。这样做的好处是可以更快地建立新连接(它节省了一些 TCP/IP 往返和一些繁重的计算),我怀疑这可能是以牺牲安全性为代价的。
我不知道 IIS(或其他 Web 服务器)是否具有将 SSL 会话缓存复制到负载平衡集群中的其他节点的功能。可能也不需要。通常,SSL 终止发生在负载平衡器上,或者使用 TCP 粘性会话来确保后续 HTTPS 连接由同一 Web 服务器处理,从而无需 Web 服务器复制 SSL 会话缓存。如果没有做到这一点
,并且 Web 服务器宣传对 SSL 恢复的支持,但负载平衡器将新连接分发到不同的 Web 服务器,则会产生不匹配。