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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:54:04