升级.NET后SQL Server 2022 SSL证书连接异常求助
.NET 6升级到.NET 8后SQL Server SSL连接异常问题
将C#项目从.NET 6升级到.NET 8后,出现以下SQL连接错误:
Microsoft.Data.SqlClient.SqlException (0x80131904): 已成功与服务器建立连接,但登录过程中发生错误。(provider: SSL Provider, error: 0 - 目标主体名称不正确。)
此前SQL Server 2017无法安装通配符SSL证书,使用自签名证书时会报错:
已成功与服务器建立连接,但登录过程中发生错误。(provider: SSL Provider, error: 0 - 证书链由不受信任的机构颁发。)
为此已将SQL Server升级到2022,Windows Server升级到2022,但问题仍未解决,尝试过以下操作:
- 使用通配符证书(服务器已接受),仍出现「目标主体名称不正确」错误
- 执行SQL语句修改服务器名称并重启服务,问题依旧:
SELECT @@SERVERNAME EXEC sp_dropserver 'SERVER'; GO EXEC sp_addserver 'FQDN SERVER NAME', local; GO
(示例FQDN为server.domain.com)
- 通过PowerShell重新生成自签名证书,在SQL管理器中重置证书并重启服务器,错误仍存在:
New-SelfSignedCertificate -Type SSLServerAuthentication -Subject "CN=FQDN Server" -FriendlyName "SQL Server Test self-signed" -DnsName "FQDN Server",'localhost.' -KeyAlgorithm RSA -KeyLength 2048 -Hash 'SHA256' -TextExtension '2.5.29.37={text}1.3.6.1.5.5.7.3.1' -NotAfter (Get-Date).AddMonths(24) -KeySpec KeyExchange -Provider "Microsoft RSA SChannel Cryptographic Provider"-CertStoreLocation "Cert:\LocalMachine\My"
- 购买新的SSL证书,通过MMC创建请求并安装,重启服务后问题依旧
- 尝试多种连接字符串组合,包括
Trusted_Connection=True;、Encrypt=false; TrustServerCertificate=true;等,修改服务器名称反复测试均无效 - 调整SQL Server网络配置的「强制加密」开关:关闭时其他应用可正常连接,开启时所有连接失败,推测SSL证书交互存在问题
- MMC中查看所有证书均正常,且都包含私钥
UPDATE:在项目中编写测试代码,使用与appsettings.json完全相同的连接字符串,可成功连接数据库并读取记录,无任何错误。测试代码如下:
private async static Task<bool> TestSQL() { var connectionString = "Server=server.domain.com;Database=myDb;Persist Security Info=True;User ID=MyUser;Password=MyPass;MultipleActiveResultSets=true;Encrypt=true;TrustServerCertificate=true;"; using (var connection = new SqlConnection(connectionString)) { try { await connection.OpenAsync(); Console.WriteLine("Connected successfully!"); // Retrieve one record from the "Customers" table var sqlQuery = "SELECT TOP 1 * FROM Customers"; using (var command = new SqlCommand(sqlQuery, connection)) { using (var reader = await command.ExecuteReaderAsync()) { if (await reader.ReadAsync()) { // Assuming "Customers" table has a column called "CustName" var custName = reader["CustName"].ToString(); Console.WriteLine($"Customer Name: {custName}"); } else { Console.WriteLine("No records found in the 'Customers' table."); } } } return true; } catch (Exception ex) { Console.WriteLine("Error connecting to SQL server: " + ex.Message); return false; } } }
这是Entity Framework或.NET的Bug吗?
内容的提问来源于stack exchange,提问作者JayTee
相关产品推荐
相关产品推荐

