.Net 5.0 Blazor Server调用同服务器Let's Encrypt API报SSL连接错误
根因说明
这个问题确实和2021年10月Let's Encrypt的证书链变更直接相关。
2021年9月30日Let's Encrypt旧的DST Root CA X3根证书正式过期,后续新签发的证书默认使用ISRG Root X1为根的跨签证书链,而Windows Server 2012自带的Schannel安全组件存在已知兼容缺陷:当同一台服务器上的服务通过HTTPS调用同机器部署的站点时,会出现SSL帧解析异常,也就是你遇到的报错。
外部调用(开发PC、Postman、其他服务调用)正常的原因是这些客户端的SSL栈没有Windows Server 2012的Schannel缺陷,可以正常解析证书链,只有服务器本地运行的.NET应用调用时才会触发该问题。
可行解决方案
按照落地成本从低到高推荐以下方案:
- 本地回环走HTTP(最快修复)
因为前后端都部署在同一台服务器,可直接将Blazor应用调用API的地址改为本地HTTP地址(如http://localhost:你的API端口),IIS给API站点额外绑定本地HTTP端口即可,对外访问依然保留HTTPS配置,不会影响外部用户使用。 - 调整服务器证书信任配置
- 运行
certlm.msc打开本地计算机证书管理器 - 进入「受信任的根证书颁发机构」→「证书」目录
- 找到名称为
DST Root CA X3的证书,右键选择属性,设置为「禁用此证书的所有目的」 - 确认
ISRG Root X1证书已经存在于受信任根证书列表中,缺失则手动导入官方根证书 - 重启IIS服务或者服务器后生效
- 运行
- 调整HttpClient的验证逻辑(仅限本地调用场景)
注入HttpClient时添加自定义证书验证规则,跳过本地API调用的证书链校验:services.AddHttpClient("ApiClient", client => { client.BaseAddress = new Uri("你的API正式地址"); }).ConfigurePrimaryHttpMessageHandler(() => { return new HttpClientHandler { ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { // 匹配你的API域名时直接信任 if (cert.Subject.IndexOf("api.你的域名.com", StringComparison.OrdinalIgnoreCase) >= 0) return true; // 其他请求走正常校验逻辑 return sslPolicyErrors == SslPolicyErrors.None; } }; }); - 升级服务器系统(长期方案)
该Schannel缺陷在Windows Server 2016及以上版本中已经修复,如果有条件升级系统,后续不会再出现同类兼容问题。
内容的提问来源于stack exchange,提问作者Ameen Nihad
相关产品推荐
相关产品推荐

