You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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也能正常连接。

解决方案

以下是几种可行的解决方法,按优先级尝试:

  1. 禁用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

修改后重启容器,再尝试连接。

  1. 在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);
        });
}

这种方式可以确保连接字符串的参数不会被全局配置覆盖。

  1. 检查全局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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:50:33