从已建立的 SqlConnection 确定 TLS 版本

Determine TLS version from established SqlConnection

在实时系统中,我们使用 C# 中的 SqlConnection 对象与各种 MSSQL 服务器建立多个连接。

由于客户端正在将其 SQL 服务器更新到 TLS 1.2,我想知道是否有办法确定活动连接上使用的是哪种 TLS 实现。

如果可能的话,我希望完全用 C# 实现,但也可以使用其他语言,只要最终结果是一个独立的应用程序。

这样做的目的是为客户提供一个快速测试工具,这将有助于确保软件在对实时系统进行更改之前在集成环境中使用 TLS 1.2 正常工作。

我已经花了几个小时研究这个问题,但到目前为止找不到任何有用的信息。我找到的所有资源都是针对 ASP 开发人员的,不会详细介绍如何在桌面应用程序中直接连接到 SQL 服务器。

该应用程序正在使用 .NET 4.5,因此 TLS 1.2 应该可用。

非常感谢

您可以使用以下查询让您的 C# 应用程序提取产品版本:

SELECT SERVERPROPERTY('ProductVersion'), SERVERPROPERTY('ProductLevel')

然后,将此版本与每个产品的 Microsoft 最低版本进行比较 level/version(您必须自定义方法来检查构建版本是否至少与每个级别一样高)。

SQL 服务器版本 - 第一个支持 TLS 1.2 的版本

SQL Server 2014 SP1 - 12.0.4439.1
SQL Server 2014 SP1 GDR - 12.0.4219.0
SQL Server 2014 RTM - 12.0.2564.0
SQL Server 2014 RTM GDR - 12.0.2271.0
SQL Server 2012 SP3 GDR - 11.0.6216.27
SQL Server 2012 SP3 - 11.0.6518.0
SQL Server 2012 SP2 GDR - 11.0.5352.0
SQL Server 2012 SP2 - 11.0.5644.2
SQL Server 2008 R2 SP3 - 10.50.6542.0
SQL Server 2008 R2 SP2 GDR (IA-64 only) - 10.50.4047.0
SQL Server 2008 R2 SP2 (IA-64 only) - 10.50.4344.0
SQL Server 2008 SP4 - 10.0.6547.0
SQL Server 2008 SP3 GDR (IA-64 only) - 10.0.5545.0
SQL Server 2008 SP3 (IA-64 only) - 10.0.5896.0

来源:https://support.microsoft.com/en-us/help/3135244/tls-1.2-support-for-microsoft-sql-server

为了任何偶然发现这个问题并寻找同一问题的解决方案的人的利益,Ed Harper 发表的评论是正确的 - I don't think there's a way to determine the TLS version in use by a connection from within SQL Server. You might have to resort to packet capture to determine the TLS version

使用 .NET 4.5 及更高版本时,支持 TLS 1.2,如果与明确指定 TLS 1.2 的服务建立连接,连接应该可以正常工作。

由于 TLS 适用于传输 OSI 层,数据包捕获是确认 TLS 版本的正确方法,如 Ed Harper 发布的 link 中所述 - https://networkengineering.stackexchange.com/questions/20227/find-ssl-version-in-tcp-packets-in-established-tcp-connection

由于我们的代码是为 .NET 4.5 编写的,因此切换到强制执行 TLS 1.2 不需要更改任何代码。

您可以通过扩展事件获取现有连接的 TLS 版本

https://support.microsoft.com/en-au/help/3191296/update-extends-the-trace-extended-event-with-security-protocol-handsha