Xamarin调用HttpClient时因Let's Encrypt证书过期出现SSL验证失败问题
异常原因
- Xamarin.Android默认使用Mono自带的独立TLS栈执行证书校验,和Android系统原生、浏览器使用的证书信任体系完全隔离。即使Android 11系统已经内置信任ISRG Root X1证书,只要Mono TLS栈没有内置对应根证书、或者存在证书链校验逻辑缺陷,就会触发验证失败错误。
- 另一常见诱因是目标站点返回的证书链包含旧的过期交叉签名证书,Mono老版本TLS栈不具备跳过过期交叉签名根证书的校验能力,无法将证书链回溯到信任的ISRG Root X1根证书;而浏览器的证书校验逻辑支持该能力,因此可以正常访问站点。
修复方案
应用端修复(兼容性最优,推荐优先使用)
- 修改Xamarin.Android项目的HttpClient配置:打开项目属性→Android选项→高级设置,将HttpClient实现调整为
Android,SSL/TLS实现调整为Native TLS 1.2+,调整后应用将直接调用Android系统原生的证书校验逻辑,和浏览器复用同一套信任策略,自动适配系统已信任的ISRG Root X1证书。 - 如需兼容更旧的系统版本,可以添加针对性的证书校验逻辑,参考代码如下:
var handler = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { // 无校验错误直接放行 if (sslPolicyErrors == SslPolicyErrors.None) return true; // 仅放行ISRG Root X1签名的合法证书,不要全局跳过证书校验 return cert.Issuer.Contains("ISRG Root X1") && chain.ChainElements.Cast<X509ChainElement>() .Any(element => element.Certificate.Thumbprint == "CABD2A79A1076A31F21D253635CB039D4329A5E8"); }; var httpClient = new HttpClient(handler);
设备端修复(针对已编译发布的第三方应用)
- 确认系统证书库中已存在ISRG Root X1证书:打开系统设置→安全→加密与凭据→信任的凭据→系统分类,查找ISRG Root X1证书,如果不存在可以手动导入该根证书到用户信任凭据中。
- 清除目标应用的缓存数据,重启应用后重试;如果是Xamarin运行时缓存异常导致的问题,卸载应用后重新安装即可恢复。
内容的提问来源于stack exchange,提问作者Andrey Rodin
相关产品推荐
相关产品推荐

