Skip to content

Entity Framework Core 7 连接证书信任问题

问题描述

升级到 Entity Framework Core 7 后,尝试连接 SQL Server 时出现以下安全证书异常:

A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - The certificate chain was issued by an authority that is not trusted.)

问题特征

  • 仅出现在 EF Core 7+ 环境
  • 连接建立成功,但在身份验证阶段失败
  • 开发环境中常见(尤其是本地 SQL Server 实例)

此问题发生在开发人员使用尚未安装有效 SSL 证书的本地 SQL Server 时。尽管尝试过在 VS2022 中调整设置(如禁用加密或信任服务器证书),但问题仍然存在。

原因分析

EF Core 7 的安全升级

EF Core 7 中,SqlClient 连接字符串的默认加密行为发生了变化:

版本Encrypt 默认值行为
EF Core 6-False允许使用无有效证书的开发环境连接
EF Core 7+True要求服务端提供有效证书

当客户端无法验证服务器证书时,就会抛出证书信任错误。

解决方案

方法 1:信任服务器证书(推荐开发环境使用)

在连接字符串中添加 TrustServerCertificate=true 参数:

json
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=YourDB;Trusted_Connection=True;TrustServerCertificate=true"
  }
}
csharp
builder.Services.AddDbContext<AppDbContext>(options => 
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
json
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=TestDB;Integrated Security=True;TrustServerCertificate=Yes"
  }
}

注意事项

此方案仅推荐在开发环境中使用,生产环境应配置有效证书。此设置会跳过证书验证,可能带来安全风险。

方法 2:禁用加密(开发环境备用方案)

在连接字符串中添加 Encrypt=false 参数:

json
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=YourDB;Trusted_Connection=True;Encrypt=false"
  }
}

方法 3:安装有效证书(生产环境方案)

为 SQL Server 配置有效的 SSL/TLS 证书:

  1. 获取受信任 CA 签名的证书或创建自签名证书
  2. 在 SQL Server 配置管理器中绑定证书
  3. 确保客户端信任该证书

实施建议

配置方案对比
方案适用环境安全级别实现复杂度
TrustServerCertificate开发环境⚠️ 中低⭐⭐⭐
Encrypt=false紧急调试⚠️ 低
安装有效证书生产环境⭐⭐⭐⭐高⭐⭐⭐⭐⭐

开发最佳实践

  1. 在主配置文件中使用 TrustServerCertificate=true
  2. 使用环境变量在部署至生产时移除该参数
  3. 结合 #if DEBUG 预处理指令区分环境配置
csharp
public void ConfigureServices(IServiceCollection services)
{
    var connectionString = Configuration.GetConnectionString("DefaultConnection");
    
    #if DEBUG
    connectionString += ";TrustServerCertificate=true";
    #endif

    services.AddDbContext<AppDbContext>(o => 
        o.UseSqlServer(connectionString));
}

常见疑问

为何选择 TrustServerCertificate 而不是禁用加密?

  • TrustServerCertificate=true 保持加密连接的同时跳过验证
  • Encrypt=false 会完全禁用 TLS 加密
  • 前者能在保持数据机密性的同时解决证书信任问题

这不是 EF Core 7 的 Bug

此行为变更是微软刻意引入的安全增强。回退到 EF Core 6 不是推荐解决方案,会导致错过安全性改进和功能更新。

总结

EF Core 7 更严格的安全要求导致在开发环境中出现证书信任异常。通过以下任一方式解决:

  1. 开发环境首选:添加 TrustServerCertificate=true
  2. 紧急方案:添加 Encrypt=false(不推荐)
  3. 生产环境必须:配置有效证书

建议结合环境变量或条件编译,确保安全设置仅在开发环境生效:开发信任服务器证书,生产配置真实证书