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

如何在Android 4.3/4.4的WebView中启用TLS 1.2?

让Android 4.3+ WebView强制使用TLS 1.2的方案

我在实际项目里处理过类似的敏感内容加载需求,针对Android 4.3及以上版本的WebView,这里分享几个经过验证的可行方案:

方案一:自定义WebViewClient配置SSL上下文(系统WebView原生支持)

Android 4.3(API 18)到4.4(API 19)的系统WebView默认不会启用TLS 1.2,我们可以手动配置SSL上下文来强制启用。

步骤1:创建支持TLS 1.2的SSLContext

private SSLContext getTLS12EnabledSSLContext() {
    try {
        SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        sslContext.init(null, null, null);
        return sslContext;
    } catch (NoSuchAlgorithmException | KeyManagementException e) {
        e.printStackTrace();
        return null;
    }
}

步骤2:配置WebView并绑定自定义WebViewClient

WebView webView = findViewById(R.id.your_webview_id);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true); // 根据业务需求开启,敏感内容建议谨慎处理

// 自定义WebViewClient处理SSL相关逻辑
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        // ⚠️ 重要提示:敏感内容绝对不能盲目忽略SSL错误!
        // 这里仅在你完全确认服务器证书合法的情况下,才调用handler.proceed()
        // 生产环境必须严格验证证书,否则会暴露在中间人攻击风险下
        if (isValidCertificate(error)) { // 替换成你的证书验证逻辑
            handler.proceed();
        } else {
            handler.cancel();
        }
    }
});

// 针对Android 4.3-4.4版本,强制设置TLS 1.2的SSLSocketFactory
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    SSLContext sslContext = getTLS12EnabledSSLContext();
    if (sslContext != null) {
        webView.setSslSocketFactory(sslContext.getSocketFactory());
    }
}

注意:Android 5.0(API 21)及以上的系统WebView默认支持TLS 1.2,所以不需要额外设置这个SocketFactory,但保留判断也不会有问题。

方案二:用OkHttp代理WebView请求(适合已集成OkHttp的项目)

如果你的项目已经在用OkHttp,利用它对TLS 1.2的良好支持,可以让WebView的所有请求通过OkHttp来处理,兼容性更强。

步骤1:配置支持TLS 1.2的OkHttpClient

private OkHttpClient getTLS12EnabledOkHttpClient() {
    // 指定仅使用TLS 1.2协议
    ConnectionSpec tls12Spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
            .tlsVersions(TlsVersion.TLS_1_2)
            .build();

    return new OkHttpClient.Builder()
            .connectionSpecs(Collections.singletonList(tls12Spec))
            .build();
}

步骤2:拦截WebView请求并用OkHttp处理

webView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            try {
                // 将WebView请求转换为OkHttp请求
                Request okHttpRequest = new Request.Builder()
                        .url(request.getUrl().toString())
                        .build();
                Response okHttpResponse = getTLS12EnabledOkHttpClient().newCall(okHttpRequest).execute();

                // 将OkHttp的响应转换为WebView可识别的格式
                return new WebResourceResponse(
                        okHttpResponse.header("Content-Type", "text/html"),
                        okHttpResponse.header("Content-Encoding", "utf-8"),
                        okHttpResponse.body().byteStream()
                );
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return super.shouldInterceptRequest(view, request);
    }
});

方案三:确保服务器端配置正确

无论客户端怎么设置,如果服务器不支持TLS 1.2,一切都是白搭。你可以用以下命令检测服务器是否支持TLS 1.2:

openssl s_client -connect your-domain.com:443 -tls1_2

如果命令能成功建立连接并返回证书信息,说明服务器配置没问题。

额外注意事项

  • 安全第一:敏感内容的加载绝对不能忽略SSL证书验证,否则会导致数据泄露或被篡改。
  • 极端兼容情况:部分老旧的Android 4.3设备可能系统缺少TLS 1.2的加密库,这种情况下可以考虑使用第三方WebView(比如曾经的Crosswalk,但现已停止维护),或者引导用户升级系统。
  • TargetSdkVersion:尽量将应用的targetSdkVersion设置到较高版本(比如33),可以获得系统层面更好的安全特性支持。

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

火山引擎 最新活动