React Native WebView安卓端SSL证书不受信问题求助
解决React Native WebView Android端SSL证书信任问题
问题背景
使用react-native-webview加载网页时,为提升安全性移除了AndroidManifest中的android:usesCleartextTraffic="true"配置,随后网页加载失败,报错:SSL error: the certificate authority is not trusted。iOS端移除NSExceptionAllowsInsecureHTTPLoads后功能正常,已尝试两种network_security_config.xml配置(如下)但未解决问题。
尝试过的配置
配置一:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">mywebsite.com</domain> </domain-config> <base-config cleartextTrafficPermitted="false" /> </network-security-config>
配置二:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config>
问题原因
报错核心是目标网站的SSL证书不被Android系统信任,可能的场景包括:
- 网站使用自签名SSL证书
- 证书链不完整(缺少中间证书)
- 证书由Android系统未预装的第三方CA颁发
之前的两种配置未命中问题:配置一仅开启明文流量,未处理证书信任逻辑;配置二仅信任系统/用户证书,若目标证书不在此范围内则无效。
解决方案
根据不同证书场景,对应配置如下:
场景1:网站使用自签名证书
- 将自签名证书文件(格式为
.pem,例如my_cert.pem)复制到android/app/src/main/res/raw/目录(若raw目录不存在则新建) - 修改
network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <!-- 替换为你的目标域名 --> <domain includeSubdomains="true">mywebsite.com</domain> <trust-anchors> <!-- 引用添加的自签名证书 --> <certificates src="@raw/my_cert" /> <!-- 保留系统信任证书 --> <certificates src="system" /> </trust-anchors> </domain-config> </network-security-config>
场景2:证书链不完整
- 优先联系网站运维补全证书链(可先通过PC端Chrome浏览器打开网站,查看证书信息确认链完整性)
- 若无法修改网站配置,可导出完整证书链为
.pem文件,参照场景1的步骤添加到项目中
场景3:证书由非系统信任的CA颁发
- 将CA根证书文件(
.pem格式)复制到android/app/src/main/res/raw/目录 - 修改
network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config> <trust-anchors> <!-- 保留系统信任证书 --> <certificates src="system" /> <!-- 引用第三方CA根证书 --> <certificates src="@raw/ca_root_cert" /> </trust-anchors> </base-config> </network-security-config>
额外注意事项
- 确保AndroidManifest中已正确配置
android:networkSecurityConfig="@xml/network_security_config" - 证书文件需保持原始
.pem格式,不要修改后缀名 - 测试前清理Android项目缓存(执行
./gradlew clean)并重新编译
内容的提问来源于stack exchange,提问作者rishikesh_07
相关产品推荐
相关产品推荐

