.NET 7 API连接Docker中SQL Server时出现不受信任证书错误
解决.NET 7连接Docker中SQL Server 2022的SSL证书信任错误
问题背景
将API从.NET Core 3.1升级到.NET 7后,连接Docker容器中的SQL Server 2022时出现SSL证书信任错误,即使在连接字符串中设置Encrypt=False或TrustServerCertificate=True也无效,但相同配置在.NET 6下正常工作,SSMS也能正常连接。
解决方案
以下是几种可行的解决方法,按优先级尝试:
- 禁用SQL Server容器的强制加密
SQL Server 2022默认启用强制加密,这可能导致客户端的Encrypt=False参数失效。修改Docker Compose配置,添加MSSQL_TLS_ENABLED=0环境变量:
version: '3.9' services: sql-server-db: image: "mcr.microsoft.com/mssql/server:2022-latest" container_name: sql-server-db environment: MSSQL_SA_PASSWORD: "P@ssw0rd" ACCEPT_EULA: "Y" MSSQL_TLS_ENABLED: "0" # 禁用服务器端TLS加密 ports: - "1433:1433" volumes: - sql1:/var/opt/mssql volumes: sql1: external: false
修改后重启容器,再尝试连接。
- 在EF Core配置中显式指定加密选项
EF Core 7默认使用Microsoft.Data.SqlClient,它对连接字符串参数的处理可能与旧版不同,可在DbContext的配置中强制指定加密和证书信任选项:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer( "server=127.0.0.1,1433;Initial Catalog=xxx;user id=sa;password=P@ssw0rd", options => { options.TrustServerCertificate(true); options.Encrypt(false); }); }
这种方式可以确保连接字符串的参数不会被全局配置覆盖。
- 检查全局SqlClient配置
.NET 7允许通过配置文件全局设置SqlClient的加密行为,检查appsettings.json或启动配置中是否存在以下配置,如果有,调整为False:
"SqlClient": { "Encrypt": "False" }
这个全局配置的优先级高于连接字符串中的参数,可能导致你的设置失效。
原因说明
.NET 7升级后,EF Core默认使用的Microsoft.Data.SqlClient在加密行为上有调整,加上SQL Server 2022默认强制启用加密,即使客户端设置Encrypt=False,服务器端的强制加密要求仍会触发证书验证。通过禁用服务器端强制加密,或在EF Core中显式配置参数,可以绕过证书信任问题。
内容的提问来源于stack exchange,提问作者John McArthur
相关产品推荐
相关产品推荐

