如何解决Xamarin Forms项目中调用API时出现的“trust anchor for certification path not found”错误?
解决Xamarin Forms中Android的SSLHandshakeException错误
嘿,作为刚接触Xamarin Forms的新手遇到这个SSL握手错误太正常了——我当初刚搞移动开发的时候也踩过这个坑!这个错误本质是Android系统不信任你的Web API使用的SSL证书,大概率是因为你的API用的是本地开发的自签名证书(ASP.NET Core默认会生成这类证书),而Android默认只信任由正规CA(证书颁发机构)签发的证书。
下面给你两种方案,分别对应开发环境(快速跑通项目)和生产环境(正规上线):
一、开发环境:快速解决(仅限开发测试,绝对不能用于生产)
方案1:用Network Security Config信任你的API证书(相对安全)
这个方法只让你的App信任你自己的API证书,不会全局忽略所有SSL验证:
- 导出ASP.NET Core的开发证书
打开命令行,进入你的Web API项目目录,执行以下命令导出证书(密码可以自己修改):dotnet dev-certs https --export-path ./certificate.pfx --password 123456 - 转换证书格式
用OpenSSL把PFX文件转成Android支持的CRT格式(如果没装OpenSSL,先去官网安装一个):openssl pkcs12 -in certificate.pfx -nokeys -out certificate.crt -passin pass:123456 - 添加证书到Android项目
在你的Xamarin Android项目里,新建Resources/raw文件夹,把生成的certificate.crt放进去(注意文件名不要有空格或特殊字符)。 - 创建Network Security配置文件
在Resources/xml文件夹(没有就新建)里创建network_security_config.xml,内容如下:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <!-- 替换成你的API域名/IP,比如localhost或者192.168.1.100 --> <domain includeSubdomains="true">your-api-domain-or-ip</domain> <trust-anchors> <!-- 信任我们添加的自定义证书 --> <certificates src="@raw/certificate"/> <!-- 同时保留系统默认的信任证书 --> <certificates src="system"/> </trust-anchors> </domain-config> </network-security-config> - 配置AndroidManifest.xml
在AndroidManifest.xml的<application>标签里添加以下属性:android:networkSecurityConfig="@xml/network_security_config"
方案2:临时忽略所有SSL验证(最简单,但最不安全)
如果上面的步骤觉得麻烦,开发时可以临时让HttpClient跳过证书验证,代码如下:
- 新建一个自定义的HttpClientHandler:
public class IgnoreSslValidationHandler : HttpClientHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 强制信任所有证书 ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true; return base.SendAsync(request, cancellationToken); } } - 创建HttpClient时使用这个Handler:
var httpClient = new HttpClient(new IgnoreSslValidationHandler());
⚠️ 重要提醒:这个方法绝对不能用于生产环境,会让你的App面临中间人攻击的风险!
二、生产环境:正规解决方案
当你的App要上线时,必须给你的Web API配置由受信任CA签发的SSL证书,比如Let's Encrypt的免费证书。这类证书会被Android系统默认信任,不需要在App里做任何额外配置,就能正常连接API。
内容的提问来源于stack exchange,提问作者Marco Silva




