从已建立的 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 版本
在实时系统中,我们使用 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 版本