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
参数:
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=YourDB;Trusted_Connection=True;TrustServerCertificate=true"
}
}
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=TestDB;Integrated Security=True;TrustServerCertificate=Yes"
}
}
注意事项
此方案仅推荐在开发环境中使用,生产环境应配置有效证书。此设置会跳过证书验证,可能带来安全风险。
方法 2:禁用加密(开发环境备用方案)
在连接字符串中添加 Encrypt=false
参数:
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=YourDB;Trusted_Connection=True;Encrypt=false"
}
}
方法 3:安装有效证书(生产环境方案)
为 SQL Server 配置有效的 SSL/TLS 证书:
- 获取受信任 CA 签名的证书或创建自签名证书
- 在 SQL Server 配置管理器中绑定证书
- 确保客户端信任该证书
实施建议
配置方案对比
方案 | 适用环境 | 安全级别 | 实现复杂度 |
---|---|---|---|
TrustServerCertificate | 开发环境 | ⚠️ 中低 | ⭐⭐⭐ |
Encrypt=false | 紧急调试 | ⚠️ 低 | ⭐ |
安装有效证书 | 生产环境 | ⭐⭐⭐⭐高 | ⭐⭐⭐⭐⭐ |
开发最佳实践:
- 在主配置文件中使用
TrustServerCertificate=true
- 使用环境变量在部署至生产时移除该参数
- 结合
#if DEBUG
预处理指令区分环境配置
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 更严格的安全要求导致在开发环境中出现证书信任异常。通过以下任一方式解决:
- 开发环境首选:添加
TrustServerCertificate=true
- 紧急方案:添加
Encrypt=false
(不推荐) - 生产环境必须:配置有效证书
建议结合环境变量或条件编译,确保安全设置仅在开发环境生效:开发信任服务器证书,生产配置真实证书。