.NET7 SQL连接字符串加密故障:目标主体名称不正确
问题描述
- 环境:.NET 7应用部署在搭载MSSQL的Windows Server 2019服务器上,站点与数据库同服务器
- 升级背景:从.NET Core 3.1升级至.NET 7后,出现SQL强制加密相关问题
- 核心现象:
- 开发环境中添加
Trust server certificate=True或Encrypt=false可解决强制加密问题,但服务器端无效 - 已配置SQL证书及权限,但服务器未使用匹配子域名的FQDN(仅有机房名),连接字符串中设置
Trust Server Certificate=true仍报错「目标主体名称不正确」 - SSMS测试验证:仅勾选「Encrypt connection」触发主体名称错误,同时勾选「Trust server certificate」可成功连接
- 连接字符串:
"Data Source=STERP\SQLEXPRESS;Initial Catalog=CBooking;Integrated Security=True;Trust Server Certificate=true",尝试过多种写法(空格、大小写等)均无效,升级前无该参数的连接字符串可正常使用
- 开发环境中添加
- 当前临时处理:管理员无法解决后,决定降级到.NET 7之前未强制加密的版本,待该版本停止支持后再处理
解决方案
针对同服务器部署、不在意通信加密的场景,可尝试以下几种可行方案:
1. 显式设置Encrypt=false
.NET 7默认加密行为已从Encrypt=false变更为Encrypt=true,即使同服务器连接也会触发加密检查。直接在连接字符串中显式添加该参数:
"Data Source=STERP\SQLEXPRESS;Initial Catalog=CBooking;Integrated Security=True;Encrypt=false"
2. 使用本地环回地址作为数据源
由于站点与数据库同服务器,将Data Source改为localhost\SQLEXPRESS或127.0.0.1\SQLEXPRESS,配合Trust Server Certificate=true使用:
"Data Source=localhost\SQLEXPRESS;Initial Catalog=CBooking;Integrated Security=True;Trust Server Certificate=true"
使用本地环回地址时,SQL Server会绕过证书主体名称的严格匹配,避免「目标主体名称不正确」的错误。
3. 全局覆盖.NET的SQL加密配置
在应用配置或启动代码中全局关闭SQL连接加密:
- 方式1:在
appsettings.json中添加配置
{ "ConnectionStrings": { "CBooking": "Data Source=STERP\SQLEXPRESS;Initial Catalog=CBooking;Integrated Security=True" }, "System.Data.SqlClient": { "Encrypt": false } }
- 方式2:在
Program.cs启动代码中添加开关
AppContext.SetSwitch("Switch.System.Data.SqlClient.Encrypt", false);
4. 适配证书主体名称(长期方案)
若后续需保留.NET 7版本,可让管理员重新生成SQL Server证书,确保证书的主体名称或SAN(主题备用名称)包含服务器当前使用的机房名/NetBIOS名称,配置完成后重启SQL Server服务再测试连接。
内容的提问来源于stack exchange,提问作者Ego Placebo
相关产品推荐
相关产品推荐

