为何Encrypt=Strict无法在System.Data.SqlClient中建立TLS 1.3连接?
我希望在System.Data.SqlClient与SQL Server 2022之间建立TLS 1.3协议通信。根据微软TDS8文档要求,需在连接字符串中添加Encrypt=Strict来建立TLS 1.3连接,但添加后抛出「Invalid value for key 'encrypt'」错误。当设置encrypt=true时,仅能建立TLS 1.2连接(已使用合规证书)。看起来encrypt仅支持true/false值,不支持strict/optional/mandatory,尽管微软文档有相关建议。
示例代码
using System.Data.SqlClient; namespace SQLClient { internal class Program { //sql conn string static string sConnStringRemoteSql2k22 = "Encrypt=Strict;Password=Password@123;Persist Security Info=True;User ID=sa;Initial Catalog=Testdb;Data Source=sql2k22.test.com;Application Name=test"; static void Main(string[] args) { SqlConnection conn = new SqlConnection(sConnStringRemoteSql2k22); try { string query = "Select * from Players"; conn.Open(); SqlCommand cmd = new SqlCommand(query, conn); using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { Console.WriteLine(dr["Name"].ToString() + " " + dr["dept"].ToString()); } } } finally { conn.Close(); } Console.ReadLine(); } } }
环境信息
- Microsoft SQL Server 2022 (RTM-CU10) (KB5031778) - 16.0.4095.4 (X64) Express Edition (64-bit) on Windows Server 2022 Standard 10.0 (Build 20348: ) (Hypervisor)
- .NET Framework 4.8.1
- System.Data version 4.0.0.0
- OS: Windows Server 2022
提问
请问为何Encrypt=Strict无法与SqlClient配合使用?或需添加其他参数来建立TLS 1.3连接?
问题原因
System.Data.SqlClient(旧版SqlClient)并不支持Encrypt=Strict这个连接字符串参数,它仅支持true/false两个值。Encrypt参数的扩展值(Strict/Optional/Mandatory)是新版Microsoft.Data.SqlClient才引入的特性,用于支持TDS 8.0和TLS 1.3协议。
解决方案
要建立TLS 1.3连接,你需要做以下调整:
- 替换为Microsoft.Data.SqlClient:将项目中的
System.Data.SqlClient引用替换为Microsoft.Data.SqlClientNuGet包(建议使用最新稳定版)。 - 修改连接字符串:使用
Encrypt=Strict,同时可以添加TrustServerCertificate=false(确保证书验证合规),连接字符串示例:Encrypt=Strict;TrustServerCertificate=false;Password=Password@123;Persist Security Info=True;User ID=sa;Initial Catalog=Testdb;Data Source=sql2k22.test.com;Application Name=test - 确认系统配置:Windows Server 2022默认支持TLS 1.3,确保SQL Server 2022已启用TLS 1.3(可通过SQL Server配置管理器确认协议启用状态)。
补充说明
如果因项目限制无法升级到Microsoft.Data.SqlClient,旧版System.Data.SqlClient在.NET Framework 4.8.1环境下,即使设置Encrypt=true也只能协商到TLS 1.2,因为它本身不支持TDS 8.0和TLS 1.3协议,没有对应的实现逻辑。
内容的提问来源于stack exchange,提问作者Mangesh Auti

