Google Play警告:如何修复HostnameVerifier的错误实现

时间:2016-11-29 21:36:59

标签: https warnings android-security

今天我收到了Google发来的这封电子邮件:

  

此电子邮件末尾列出的您的应用不安全   HostnameVerifier接口的实现,接受所有接口   与远程主机建立HTTPS连接时的主机名   setDefaultHostnameVerifier API,从而使您的应用程序易受攻击   对中间人的攻击。攻击者可以读取传输的数据   (例如登录凭证),甚至更改传输的数据   HTTPS连接。

可悲的是,我搜索了所有代码,发现没有使用HostnameVerifier,也没有使用setDefaultHostnameVerifier甚至任何HTTPS连接!

我在其最新版本:25.0.1中使用Google兼容性库,在我的某些应用中使用Google Ads 9.8.0。将广告升级到10.0.1,因为我只能假设罪魁祸首在那里?!

有没有人收到此提醒,如果有,你是如何解决的?

2 个答案:

答案 0 :(得分:1)

相同 - 在APK

中检测到不安全的主机名验证程序
  

您的应用正在使用HostnameVerifier的不安全实现。请   有关详细信息,请参阅此Google帮助中心文章,其中包括   修复漏洞的截止日期。我没有使用HostnameVerifier   而不是调用setDefaultHostnameVerifier。而且 - 我使用OKHTTP   用于http请求的lib。我希望定义TrustManager能解决   这个问题。

由于我没有继承HostnameVerifier或调用setDefaultHostnameVerifier(),我认为它依赖于某些第三方lib。由于我无法检测到这样的lib,我想我会尝试添加一个包含以下代码的类

    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
        public boolean verify(final String hostname, final SSLSession session) {
            if (check if SSL is really valid)
                return true;
            else
                return false;
        }
    });

到我的项目,看看它是否解决了这个问题 所以我做了它,除了每个webView我都添加了重写方法

@Override
            public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
// the main thing is to show dialog informing user
// that SSL cert is invalid and prompt him to continue without 
// protection: handler.proceed();
// or cancel: handler.cancel();
                String message;
                switch(error.getPrimaryError()) {
                    case SslError.SSL_DATE_INVALID:
                        message = ResHelper.getString(R.string.ssl_cert_error_date_invalid);
                        break;
                    case SslError.SSL_EXPIRED:
                        message = ResHelper.getString(R.string.ssl_cert_error_expired);
                        break;
                    case SslError.SSL_IDMISMATCH:
                        message = ResHelper.getString(R.string.ssl_cert_error_idmismatch);
                        break;
                    case SslError.SSL_INVALID:
                        message = ResHelper.getString(R.string.ssl_cert_error_invalid);
                        break;
                    case SslError.SSL_NOTYETVALID:
                        message = ResHelper.getString(R.string.ssl_cert_error_not_yet_valid);
                        break;
                    case SslError.SSL_UNTRUSTED:
                        message = ResHelper.getString(R.string.ssl_cert_error_untrusted);
                        break;
                    default:
                        message = ResHelper.getString(R.string.ssl_cert_error_cert_invalid);
                }
                mSSLConnectionDialog = new MaterialDialog.Builder(getParentActivity())
                        .title(R.string.ssl_cert_error_title)
                        .content(message)
                        .positiveText(R.string.continue_button)
                        .negativeText(R.string.cancel_button)
                        .titleColorRes(R.color.black)
                        .positiveColorRes(R.color.main_red)
                        .contentColorRes(R.color.comment_grey)
                        .backgroundColorRes(R.color.sides_menu_gray)
                        .onPositive(new MaterialDialog.SingleButtonCallback() {
                            @Override
                            public void onClick(MaterialDialog materialDialog, DialogAction dialogAction) {
                                mSSLConnectionDialog.dismiss();
                                handler.proceed();
                            }
                        })
                        .onNegative(new MaterialDialog.SingleButtonCallback() {
                            @Override
                            public void onClick(MaterialDialog materialDialog, DialogAction dialogAction) {
                                handler.cancel();
                            }
                        })
                        .build();
                mSSLConnectionDialog.show(); 
}

mWebView.setWebViewClient(new WebViewClient() {
... // other corresponding overridden methods
}

最后谷歌说:

  

安全扫描完成
  没有检测到APK 158的已知漏洞。

但是,我不确定代码是什么,HostNameVerifieronReceivedSslError() mWebView.setWebViewClient

答案 1 :(得分:0)

根据从Google收到的邮件,此问题可能有两种可能性:

主要是您必须检查您的包裹名称是否使用Google限制的任何关键字。例如" com.companyname。 android ",不允许使用.android。次要是检查HostNameVerifier

HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
    public boolean verify(final String hostname, final SSLSession session) {
        if (/* check if SSL is really valid */)
            return true;
        else
            return false;
    }
});