Gav*_*ris 5 sql-server linked-server tls-1.2
作为最近的安全闪电战的一部分,我们在所有服务器上设置了 TLS 1.2。昨晚我在我们所有的 SQL Server 上翻转了“强制加密”标志,从那时起我在链接服务器上遇到了一个奇怪的问题。
我有两台服务器;
服务器 A 运行 SQL Server 2016 SP2 CU3
运行 SQL Server 2012 SP4 的服务器 B
两者都有正确的加密证书,都有必要的注册表编辑来禁用 SSL 和 TLS 1.0 和 1.1,只启用 TLS 1.2。两者都在 SQL Server Config Mgr 中设置了证书并设置了“强制加密”。
从服务器 A 到 B(2016 年到 2012 年)的链接服务器工作正常。从服务器 B 到 A(2012 年到 2016 年)的链接服务器显示服务器并列出数据库,但任何通过该链接服务器查询表的尝试都会生成错误:
TCP Provider: The specified network name is no longer available. (Microsoft SQL Server, Error: 64)
但是,我可以在服务器 B 上启动 SQL Server Management Studio 会话并连接到服务器 A 就好了。所以只有链接服务器有问题。
我检查了服务器 A 上的扩展事件,我可以看到使用 TLS 1.2 来自服务器 B 的 SSL 握手的跟踪事件,因此连接请求显然带有正确的加密集。
谷歌搜索错误似乎表明存在名称解析问题,因此我尝试使用 FQDN 和 IP 地址设置其他链接服务器,但都没有解决问题。
在这一点上的任何帮助都可以挽救我剩下的头发。
为了消除网络问题,我使用了一台 2016 年的服务器,该服务器上有一个 2012 年的实例以实现向后兼容性。同样的问题。2016 实例可以查询到 2012 实例的链接服务器。2012 实例无法查询到 2016 实例的链接服务器。两个 2016 年实例之间的第二次测试也有同样的问题。
SQL Server 客户端版本为 11.4.7462.6。
注册表设置:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server]
"DisabledByDefault"=dword:00000001
"Enabled"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001
Run Code Online (Sandbox Code Playgroud)
您是否熟悉使用 netmon、wireshark 或 netsh 等工具?您可能需要在复制此问题时进行捕获。我脑海中浮现的一件事是,服务器 B 可能会尝试访问混合外部的内容(即证书吊销列表 CRL 检查),并且该调用失败。CRL 检查发生在等式的客户端 - 在本例中,服务器 B 是客户端。如果您能够运行跟踪,您可能希望过滤涉及客户端(服务器 B)的 tcp 重置。在wireshark中,过滤器看起来像tcp.flags.reset == 1和ip.addr == 10.XXX,其中10.XXX是服务器B的IP地址。