You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决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验证:

  1. 导出ASP.NET Core的开发证书
    打开命令行,进入你的Web API项目目录,执行以下命令导出证书(密码可以自己修改):
    dotnet dev-certs https --export-path ./certificate.pfx --password 123456
    
  2. 转换证书格式
    用OpenSSL把PFX文件转成Android支持的CRT格式(如果没装OpenSSL,先去官网安装一个):
    openssl pkcs12 -in certificate.pfx -nokeys -out certificate.crt -passin pass:123456
    
  3. 添加证书到Android项目
    在你的Xamarin Android项目里,新建Resources/raw文件夹,把生成的certificate.crt放进去(注意文件名不要有空格或特殊字符)。
  4. 创建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>
    
  5. 配置AndroidManifest.xml
    AndroidManifest.xml<application>标签里添加以下属性:
    android:networkSecurityConfig="@xml/network_security_config"
    

方案2:临时忽略所有SSL验证(最简单,但最不安全)

如果上面的步骤觉得麻烦,开发时可以临时让HttpClient跳过证书验证,代码如下:

  1. 新建一个自定义的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);
        }
    }
    
  2. 创建HttpClient时使用这个Handler:
    var httpClient = new HttpClient(new IgnoreSslValidationHandler());
    

⚠️ 重要提醒:这个方法绝对不能用于生产环境,会让你的App面临中间人攻击的风险!

二、生产环境:正规解决方案

当你的App要上线时,必须给你的Web API配置由受信任CA签发的SSL证书,比如Let's Encrypt的免费证书。这类证书会被Android系统默认信任,不需要在App里做任何额外配置,就能正常连接API。

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

火山引擎 最新活动