关于#Android webview加载https地址#的问题,如何解决?(语言-java)

Android 少数手机在webview加载https地址时报错,且没有走onReceivedSslError回调方法,在onReceivedError报错:net::ERR_SSL_PROTOCOL_ERROR。
新进展:APP集成VPN,现在跳过VPN之后,直连内网可以访问到该地址;过VPN后访问该地址加载失败。
有没有遇到过相似问题的,该如何解决?


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    webView.setWebContentsDebuggingEnabled(true);
}
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
    }
});

这个错误通常意味着 Android 设备无法处理 HTTPS 连接,因为设备无法验证服务器的身份或证书
以下是一些可能导致此错误的原因和解决方法:
1、设备不支持 HTTPS:HTTPS 是一种加密协议,只有支持 HTTPS 的浏览器才能正确解密和显示加密的内容。
解决方法:检查设备是否支持 HTTPS,确保浏览器已正确安装和配置
2、应用程序未正确处理 HTTPS 连接
解决方法:检查程序是否正确处理了 HTTPS 连接,可以通过在 AndroidManifest.xml 文件中添加 WebView 权限,以允许 WebView 处理 HTTPS 连接来解决此问题。
3、应用程序访问的资源受到限制:例如,程序中包含 JSON 格式的数据,并需要通过 GET 或 POST 请求发送到服务器,那么程序可能无法处理 HTTPS 连接。
解决方法:检查程序是否需要访问受限制的资源,确保程序已正确处理这些资源。可以通过在 AndroidManifest.xml 文件中添加 WebView 权限,以允许 WebView 处理 HTTPS 连接来解决此问题。
4、应用程序安全设置:设置了安全限制,例如,只允许从受信任的域名访问资源,那么程序无法处理 HTTPS 连接。
解决方法:检查程序是否设置了安全限制,确保程序已正确处理这些限制。可以通过在 AndroidManifest.xml 文件中添加 WebView 权限,以允许 WebView 处理 HTTPS 连接来解决此问题。

如果以上所有解决方法,但仍然无法解决问题,那可考虑使用其他加密协议,例如 SSL/TLS,以确保应用程序正确处理 HTTPS 连接。

https网址直接复制出来再网页上能打开么?如果可以的话你直接忽略所有ssl验证试一下呢?

net::ERR_SSL_PROTOCOL_ERROR通常是由于SSL/TLS握手过程中发生问题导致的。这种情况可能有多种原因,例如服务器证书问题、客户端与服务器之间的协议不匹配等。以下是一些建议来解决此问题:

1:确保服务器证书有效:请检查您的服务器是否已正确配置SSL/TLS证书。可以使用SSL Labs的SSL Server Test来检查您的服务器配置。如果证书存在问题,请根据检查结果修复相应问题。

2:升级服务器SSL/TLS配置:请确保您的服务器支持较新的SSL/TLS协议(如TLS 1.2或更高版本),以确保与Android设备兼容。此外,检查服务器端的加密套件配置,确保其支持较新版本的Android设备。

3:检查客户端配置:部分较旧的Android设备可能不支持较新的SSL/TLS协议或加密套件。在此情况下,您可能需要在服务器端降低配置要求以支持这些设备。然而,请注意,这可能会降低服务器的安全性。

4:清除WebView缓存:有时候,WebView的缓存可能导致问题。您可以尝试清除WebView的缓存,看看是否可以解决问题:

img


5:在WebViewClient的onReceivedError方法中处理错误:如果您的Android设备未调用onReceivedSslError方法,但在onReceivedError方法中报告错误,您可以尝试在onReceivedError方法中处理错误。例如,您可以向用户显示一条错误消息,或者尝试重新加载页面。

img


6:检查网络配置:确保设备的网络配置正确,没有阻止SSL/TLS连接。有时,代理服务器、防火墙或者其他网络设备可能会导致SSL/TLS连接出现问题。

7:尝试更新Android系统:如果可能,尝试更新设备上的Android系统。较新的Android版本可能会修复与SSL/TLS相关的问题。

请注意,这些解决方案可能会增加安全风险,因此在实施之前,请确保权衡好安全性和兼容性的关系。希望这些建议对您有所帮助!码字不易还望采纳!

引用chatGPT作答,这个问题可能是由于设备不支持特定的 SSL/TLS 协议或证书验证问题引起的。

以下是可能的解决方案:

1.检查设备的安全设置和证书
请确保设备的安全设置不会阻止 SSL/TLS 协议的连接,可以尝试在设备上访问其他 HTTPS 网站,以确定是否存在证书验证问题。如果有问题,可以尝试安装正确的证书或者重新配置设备的安全设置。

2.更新 WebView
如果您的应用使用的 WebView 版本过旧,可能会出现此问题。请尝试更新 WebView 到最新版本,并测试是否有所改善。

3.通过 WebViewClient 处理 SSL 错误
如果 WebView 在加载 HTTPS 页面时没有走 onReceivedSslError 回调方法,可以尝试使用 WebViewClient 处理 SSL 错误。您可以扩展 WebViewClient 类并覆盖 onReceivedSslError 方法,然后在 WebView 中设置该类。

以下是一个示例:

WebView webView = findViewById(R.id.webview);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
    }
});

4.使用其他浏览器引擎
如果以上解决方案都没有解决问题,您可以尝试使用其他浏览器引擎,如 Chrome Custom Tabs 或 Mozilla GeckoView。

希望这些解决方案可以帮助您解决这个问题!

  • 这篇博客: Android Webview https 证书问题及混淆打包后不能访问中的 一、Webview Https 引起的SslError错误解决办法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这个问题相对简单,直接忽略掉SslError错误就行,处理办法如下:

    调用webview.setWebViewClient()时候重写WebViewClient的onReceivedSslError方法;

    override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
        handler!!.proceed()
    }

    这种解决办法是简单粗暴的方法,能够快速的解决当前的https问题,但同时存在一定的安全隐患,让一些有不法分子有机可乘。更安全的做法是需要对域名进行验证,这个解决办法后期加上。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题可能是由于SSL证书未被信任引起的。你可以在WebView中设置一个WebViewClient,重写onReceivedSslError方法,并在其中进行处理。

以下是一个示例:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
        AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);
        builder.setMessage(R.string.notification_error_ssl_cert_invalid);
        builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                handler.proceed();
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                handler.cancel();
            }
        });
        AlertDialog dialog = builder.create();
        dialog.show();
    }

    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        Log.e(TAG, "Error: " + description);
    }
});

在这个示例中,如果遇到未受信任的SSL证书,会弹出一个对话框询问用户是否继续。如果用户点击“Continue”,则继续加载页面;如果用户点击“Cancel”,则停止加载页面。

另外,你提到的“net::ERR_SSL_PROTOCOL_ERROR”错误可能也与SSL证书有关。你可以尝试让服务器管理员检查证书的有效性和配置。
如果我的回答解决了您的问题,请采纳!