React Native安卓模拟器向本地不安全HTTPS服务器发送Fetch请求问题
绕过Android模拟器中HTTPS无效证书验证的方案
场景1:WebView中的Fetch请求
如果你的Fetch请求是在WebView内执行,可通过重写WebViewClient的SSL错误处理逻辑绕过验证:
webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { // 忽略SSL错误,继续加载内容 handler.proceed(); } });
注意:不要保留父类的默认实现,否则会触发系统默认的拦截逻辑。
场景2:Android原生网络请求(如OkHttp/Retrofit)
针对原生网络请求,可自定义信任所有证书的TrustManager并配置到请求客户端:
// 创建信任所有证书的TrustManager TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) {} @Override public void checkServerTrusted(X509Certificate[] chain, String authType) {} @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; } } }; // 初始化SSL上下文 SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new SecureRandom()); SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); // 构建信任所有证书的OkHttpClient OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]) .hostnameVerifier((hostname, session) -> true) // 忽略主机名匹配验证 .build();
若使用Retrofit,直接将上述client传入Retrofit构建器即可。
替代方案:解决模拟器证书安装黑屏问题
若不想绕过验证,可通过命令行安装证书(规避模拟器UI黑屏bug):
- 先计算证书哈希值(假设证书文件为
local_cert.crt):
openssl x509 -inform PEM -subject_hash_old -in local_cert.crt | head -1
- 启动模拟器后执行以下命令:
adb root adb remount # 将证书推至系统证书目录,文件名改为【哈希值.0】 adb push local_cert.crt /system/etc/security/cacerts/[哈希值].0 adb shell chmod 644 /system/etc/security/cacerts/[哈希值].0 adb reboot
重启后模拟器会信任该证书,无需再绕过验证。
重要提醒
所有绕过验证的方法仅适用于本地开发测试,绝对不能用于生产环境,会导致应用面临严重安全风险。
内容的提问来源于stack exchange,提问作者Álvaro Vega Romero
相关产品推荐
相关产品推荐

