React Native WebView部分设备无法运行 旧设备报SSL证书不受信任错误码3如何解决
问题原因
这个错误是WebView加载目标地址时SSL证书校验失败导致的,仅出现在旧设备上通常有几个核心诱因:
- 目标站点使用的根CA证书未被旧设备的系统根证书库收录,比如2021年后DST Root CA X3过期后,安卓7.0以下系统默认不信任Let's Encrypt颁发的证书
- 目标站点的证书链配置不全,缺失中间证书,旧版WebView无法自动补全证书链完成校验
- 故障设备的系统时间异常,超出了SSL证书的有效期限范围
- 旧版WebView不支持站点使用的新加密套件或SNI扩展,导致握手失败
解决方案
分不同场景选择适配方案:
通用排查步骤
- 先确认目标站点的SSL证书配置完整,包含全量中间证书,使用的根证书为公开授信的CA颁发
- 确认故障设备的系统时间设置正确,与标准时间偏差不超过1小时
快速适配(仅适用于测试环境,生产环境不推荐)
在WebView组件中新增onReceivedSslError回调,对可信域名的SSL校验错误做放行:
import {WebView} from 'react-native-webview'; <WebView ref={webViewRef} source={{uri:uri}} originWhitelist={['*']} // 新增SSL错误处理逻辑 onReceivedSslError={(event) => { const { nativeEvent: { url } } = event; // 仅放行自身可控的可信域名,避免产生安全风险 if (url.startsWith('https://你的可信域名')) { event.preventDefault(); return true; } }} onNavigationStateChange={ (state)=>{ const back = state.canGoBack const forward = state.canGoForward setCanGoBack(back) setCanGoForward(forward) } } />
生产环境安全适配方案
安卓端
针对安卓7.0以下系统不识别新根证书的问题,通过网络安全配置预埋可信根证书:
- 将目标站点的根证书PEM格式文件存放到安卓项目
app/src/main/res/raw目录,命名为custom_root_ca.pem - 在
app/src/main/res/xml目录下新建network_security_config.xml文件,写入以下内容:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <domain includeSubdomains="true">你的站点域名</domain> <trust-anchors> <certificates src="@raw/custom_root_ca"/> <certificates src="system"/> </trust-anchors> </domain-config> </network-security-config>
- 在
AndroidManifest.xml的<application>标签中新增属性:
android:networkSecurityConfig="@xml/network_security_config"
iOS端
针对旧版iOS系统不识别新根证书的问题,可通过预埋证书做本地校验:
- 将根证书文件添加到iOS项目的主Bundle中
- 在WebView的
onShouldStartLoadWithRequest回调中对请求的证书做本地校验,校验通过则放行请求
服务端优化
优先选择兼容性更高的公信任CA颁发的证书,配置完整证书链,同时保留对旧设备兼容的TLS1.2协议和加密套件,不要仅启用TLS1.3等新协议。
内容的提问来源于stack exchange,提问作者Adil Ijaz
相关产品推荐
相关产品推荐

