【问题标题】:WebView ssl errorWebView ssl 错误
【发布时间】:2017-02-26 12:03:11
【问题描述】:

对不起我的英语。我需要加载 url https,我有一些问题。当我尝试加载页面时,webView 给我错误

primary error: 3 certificate: Issued to: CN=my-site.com;
Issued by: CN=GeoTrust DV SSL CA - G3,OU=Domain Validated SSL,O=GeoTrust Inc.,C=US;
on URL: https://my-site.com/tutorial.php

如果我像这样创建自定义 WebView 客户端并重新定义方法 onReceivedSslError

@Override
        public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
handler.proceed();
}

然后当我将这个应用程序加载到市场时,谷歌的人会说我:

Your APK has been rejected for containing security vulnerabilities, which violates the  Malicious Behavior policy

我可以解决这个问题,请执行以下操作:

final AlertDialog.Builder builder = new AlertDialog.Builder(WebViewTutorials.this);
            String message = "SSL Certificate error.";
            switch (error.getPrimaryError()) {
                case SslError.SSL_UNTRUSTED:
                    message = "The certificate authority is not trusted.";
                    break;
                case SslError.SSL_EXPIRED:
                    message = "The certificate has expired.";
                    break;
                case SslError.SSL_IDMISMATCH:
                    message = "The certificate Hostname mismatch.";
                    break;
                case SslError.SSL_NOTYETVALID:
                    message = "The certificate is not yet valid.";
                    break;
            }
            message += " Do you want to continue anyway?";

            builder.setTitle("SSL Certificate Error");
            builder.setMessage(message);
            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();
                    finish();
                }
            });
            final AlertDialog dialog = builder.create();
            dialog.show();

但是对于这个应用程序显示用户弹出窗口是不可接受的 来自后端的人说我“这是你在客户端的问题”。我不知道我在做什么,需要显示用户 webView 页面但不显示带有警告的弹出窗口

【问题讨论】:

  • 您不应忽略 SSL 错误,但服务器应改用公开信任且配置正确的证书。但是,由于服务器未知,因此无法说出当前证书/配置的确切问题。
  • 您的服务器是否返回了 my-site.com 的完整证书链?使用 SSL Labs (ssllabs.com/ssltest/index.html) 等在线扫描仪进行检查。如果您有来自 GeoTrust 的域验证证书,则不必执行所有这些自定义 SSL 处理。

标签: android ssl webview


【解决方案1】:

您好,您的第一个问题是您的 SSL 证书,WebView 不会生成 HTTPS 连接。无论如何,另一个问题是您覆盖方法 onReceivedSslError 并使用 handler.proceed();没有告知用户您使用不安全的连接是 android 的一个安全漏洞,因此 Play 商店不允许您发布您的 apk。

最好的方法是纠正证书问题,让应用可以通过 https 连接与服务器通信。

无论如何,您可以通过这种方式更改方法的实现,以避免发布问题:


@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(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();
        }
    });
    final AlertDialog dialog = builder.create();
    dialog.show();
}

您可以查看android开发者的安全部分以获取有关此漏洞和更正的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多