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

Xamarin.Forms Android WebView因无效SSL证书空白(开发环境)

解决方案:Xamarin Android WebView无法加载本地HTTPS服务(IP访问证书错误)

我来帮你搞定这个问题!核心原因很明确:你的.NET Core服务用的SSL证书只绑定了localhost,当用PC的IP(比如192.168.0.2)访问时,证书与访问地址不匹配,Android WebView默认会拦截这种不被信任的SSL连接,所以才会显示空白。下面是一步步的解决办法:

一、给.NET Core服务生成包含IP地址的SSL证书

首先得替换掉原来的localhost证书,生成一个同时支持localhost和你的PC IP的自签名证书。这里用OpenSSL来生成(如果没装OpenSSL,先去官网下载安装):

  1. 创建OpenSSL配置文件
    新建一个名为openssl.cnf的文件,内容如下(修改省份、城市等信息为你自己的,重点是alt_names段添加你的PC IP):
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C = CN
ST = 你的省份
L = 你的城市
O = 你的组织名称
OU = 你的部门
CN = localhost

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.1 = 192.168.0.2  # 替换成你的PC实际IP
  1. 生成证书相关文件
    打开命令行,切换到配置文件所在目录,依次执行以下命令:
# 生成私钥和证书签名请求
openssl req -new -newkey rsa:2048 -nodes -keyout localhost-with-ip.key -out localhost-with-ip.csr -config openssl.cnf

# 生成自签名证书(有效期1年)
openssl x509 -req -in localhost-with-ip.csr -signkey localhost-with-ip.key -out localhost-with-ip.crt -days 365 -extensions req_ext -extfile openssl.cnf

# 转换成PFX格式(供.NET Core使用,设置一个密码,比如123456)
openssl pkcs12 -export -out localhost-with-ip.pfx -inkey localhost-with-ip.key -in localhost-with-ip.crt -passout pass:123456
  1. 配置.NET Core服务使用新证书
    把生成的localhost-with-ip.pfx文件复制到你的.NET Core项目根目录,然后修改项目配置:
  • 如果用appsettings.json,添加Kestrel配置:
"Kestrel": {
  "Endpoints": {
    "Https": {
      "Url": "https://0.0.0.0:5000",
      "Certificate": {
        "Path": "localhost-with-ip.pfx",
        "Password": "123456"  # 换成你刚才设置的密码
      }
    },
    "Http": {
      "Url": "http://0.0.0.0:5001"
    }
  }
}
  • 或者在Program.cs中直接配置Kestrel(.NET Core 2.2):
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseKestrel(options =>
        {
            // 监听所有IP的5000端口,使用新证书
            options.ListenAnyIP(5000, listenOptions =>
            {
                listenOptions.UseHttps("localhost-with-ip.pfx", "123456");
            });
            // 监听HTTP的5001端口
            options.ListenAnyIP(5001);
        });

最后记得把localhost-with-ip.pfx的复制到输出目录属性设置为“始终复制”。

二、让Android应用信任这个自签名证书

生成好证书后,还要让Android设备/应用信任它,有两种方式:

方式1:手动安装证书到Android系统(适合测试设备)

  • 把生成的localhost-with-ip.crt文件传到你的Android设备(比如通过微信、邮件或者数据线)
  • 打开设备的设置 → 安全 → 加密与凭据 → 从存储安装(不同品牌路径可能略有差异)
  • 选择刚才的证书文件,给证书起个名字,选择“VPN和应用”作为用途,完成安装。

方式2:配置应用内信任证书(无需手动安装,适合开发)

  1. 在Xamarin Android项目的Resources/xml目录下(没有就新建),创建network_security_config.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <!-- 指定信任的域名/IP -->
        <domain includeSubdomains="true">192.168.0.2</domain>
        <trust-anchors>
            <!-- 引用我们的自签名证书(放在Resources/raw目录) -->
            <certificates src="@raw/localhost_with_ip" />
            <!-- 同时保留系统默认信任的证书 -->
            <certificates src="system" />
        </trust-anchors>
    </domain-config>
</network-security-config>
  1. 把localhost-with-ip.crt文件复制到Resources/raw目录,重命名为localhost_with_ip.crt(Android资源文件名不能有连字符),然后设置它的生成操作为AndroidResource。
  2. 修改AndroidManifest.xml的application标签,添加网络安全配置:
<application android:label="YourAppName" android:networkSecurityConfig="@xml/network_security_config">

三、自定义WebView渲染器(测试应急方案)

如果上面的配置还没解决问题,可以临时用自定义渲染器绕过SSL验证(仅限开发测试,绝对不能用于生产环境):
在Xamarin Android项目中添加以下代码:

using Android.Content;
using Android.Webkit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(WebView), typeof(CustomWebViewRenderer))]
namespace YourAppNamespace.Droid
{
    public class CustomWebViewRenderer : WebViewRenderer
    {
        public CustomWebViewRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                Control.SetWebViewClient(new CustomWebViewClient());
            }
        }
    }

    public class CustomWebViewClient : WebViewClient
    {
        public override void OnReceivedSslError(Android.Webkit.WebView view, SslErrorHandler handler, Android.Net.Http.SslError error)
        {
            // 仅在测试环境允许通过SSL验证,生产环境请删除这段逻辑
            if (error.PrimaryError == Android.Net.Http.SslError.SslInvalid || 
                error.PrimaryError == Android.Net.Http.SslError.SslUntrusted)
            {
                handler.Proceed();
            }
            else
            {
                handler.Cancel();
            }
        }
    }
}

最后注意事项

  • 生产环境绝对不能用自签名证书,要使用权威CA机构颁发的合法证书
  • 测试用的配置(比如绕过SSL验证)一定要在发布前移除,避免安全风险
  • 确保你的PC和Android设备在同一个局域网内,IP能正常访问

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:02:43