我有一台 Windows Server 2012 R2,它是一台 DC,其中 SQL Server 2014 (Express) 已更新至最新 SP2,CU10 12.2.5571.0(测试环境)。我禁用了除以下协议之外的所有协议:TLS1.1和TLS1.2通过在路径中设置注册表项:
HKLM SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols
。
我最初只启用了 TLS1.2,但为了向后兼容在同一域的另一台机器上运行的 Java 应用程序,我还需要 TLS1.1。为了使用 TLS1.2,需要特定的 JDBC 驱动程序,并且必须为 JDBC url 提供一个属性(请参阅讨论这里)。
同时我想让应用程序使用 TLS1.1,所以我重新启用了它。但是应用程序无法连接到数据库,而且似乎 SQL Server 未使用 TLS1.1。为了测试连接,我尝试了以下命令:
1)openssl s_client -connect <Server IP>:1433 -ssl3
2)openssl s_client -connect <Server IP>:1433 -tls1_1
3)openssl s_client -connect <Server IP>:1433 -tls_1_2
测试 1) 按照预期失败(握手失败),而测试 2) 需要花费一些时间(大约 30 秒或更长时间)才能产生成功的响应。测试 3) 按照预期产生了成功的输出。
我还尝试从客户端计算机使用 Management Studio,并且只有在客户端和服务器上都启用了 TLS1.2 时,连接才有效。否则,如果仅启用 TLS1.1,则会显示以下错误:
已成功与服务器建立连接,但在登录过程中出现错误。(提供程序:SSL 提供程序,错误:0 - 客户端和服务器无法通信,因为它们没有通用算法。)
这怎么可能?
我需要在安全通道上强制执行某些操作吗?
为什么 SQL Server 不再允许 TLS1.1 连接?
答案1
协议与算法不同。
无论您如何配置 SQL Server,操作系统也必须允许该协议并支持该算法。
更多信息请阅读: https://blogs.msdn.microsoft.com/sql_protocols/2007/06/29/ssl-cipher-suites-used-with-sql-server/
确定客户端和服务器相互支持的最高级别协议。目前公认的协议从高到低依次为:TLS1.1、TLS1.0、SSL3.0、SSL2.0 客户端将从协商的协议中向服务器提供其密码套件列表 服务器将从客户端的列表中选择它能够支持的最强的密码套件。
您可以在此处找到有关 SSL 最佳实践的更多信息 https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices
如果你不喜欢摆弄 Windows 注册表,你可以使用 Nartact 免费工具IIS 加密配置 Windows 服务器。IIS 部分无关紧要。此工具实际上配置操作系统。
答案2
我已验证,为了使用协议 TLS1.1,必须设置以下密钥:
- 沙哈希已启用(已启用键设置为 1)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\SHA
- TLS 1.0协议已启用(已启用键设置为 1 并且默认禁用对于客户端和服务器均设置为 0)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server
注意:更改这些密钥后,请重新启动机器,以便重置安全通道连接。
如果禁用 SHA 哈希或 TLS 1.0 协议,则协议 TLS 1.1 将由于未知原因停止工作。