TLS 1.2 破坏 SQL Server 链接服务器

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)

Sql*_*ase 1

您是否熟悉使用 netmon、wireshark 或 netsh 等工具?您可能需要在复制此问题时进行捕获。我脑海中浮现的一件事是,服务器 B 可能会尝试访问混合外部的内容(即证书吊销列表 CRL 检查),并且该调用失败。CRL 检查发生在等式的客户端 - 在本例中,服务器 B 是客户端。如果您能够运行跟踪,您可能希望过滤涉及客户端(服务器 B)的 tcp 重置。在wireshark中,过滤器看起来像tcp.flags.reset == 1和ip.addr == 10.XXX,其中10.XXX是服务器B的IP地址。