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

.NET 5 HttpClient报SSL连接无法建立错误,同测试在.NET Core 3.1正常

.NET 5单元测试HTTPS请求SSL连接失败解决方案

报错信息:The SSL connection could not be established, Inner: Received an unexpected EOF or 0 bytes from the transport stream

根因说明

该问题由.NET 5对TLS协议栈的默认策略变更导致:

  • .NET 5默认收紧了Schannel(Windows TLS实现)的证书校验规则,对未导入系统受信任根存储的测试用自签名证书、低安全等级证书的拦截逻辑比.NET Core 3.1更严格
  • 基于.NET Core 3.0构建的服务端在.NET 5运行时环境下启动时,TLS握手协商存在兼容性问题,会导致服务端提前中断连接,对应系统日志中的Schannel报错

解决方案

1. 修正测试证书配置(生产环境也适用)

  • 将测试用X.509证书导入测试设备的受信任的根证书颁发机构存储路径,确保证书CN字段为localhost,且包含「服务器身份验证」增强型密钥用法扩展
  • 禁用低于2048位的RSA证书、过期证书,.NET 5默认会拒绝此类低安全等级证书

2. 单元测试场景临时跳过证书验证

在初始化HttpClient时显式配置自定义证书验证回调:

var httpHandler = new HttpClientHandler
{
    ServerCertificateCustomValidationCallback = (_, _, _, _) => true
};
var httpClient = new HttpClient(httpHandler);

3. 显式指定TLS协议版本对齐两端配置

服务端Kestrel配置固定使用TLS 1.2:

webBuilder.ConfigureKestrel(opt =>
{
    opt.ListenLocalhost(6001, listenOpt =>
    {
        listenOpt.UseHttps("你的证书文件路径.pfx", "证书密码", httpsOpt =>
        {
            httpsOpt.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;
        });
    });
});

客户端同步配置TLS版本:

httpHandler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12;

4. 长期兼容方案

将原有基于.NET Core 3.0的服务端项目升级到.NET 5及以上版本,消除跨运行时的TLS协商兼容性问题。


内容的提问来源于stack exchange,提问作者MikeZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:54:03