【问题标题】:Google Play security alert for insecure TrustManager针对不安全的 TrustManager 的 Google Play 安全警报
【发布时间】:2016-02-17 19:27:57
【问题描述】:

在我的一个应用程序中,我使用带有自签名证书的 HTTPS,并遵循来自 android 开发人员培训网站 (https://developer.android.com/training/articles/security-ssl.html#UnknownCa) 的示例代码。

我最近收到以下警报,说当前的实现不安全:

安全警报

您的应用正在使用不安全的 X509TrustManager 与 Apache HTTP 客户端的接口,导致 安全漏洞。请参阅this Google Help Center article 详细信息,包括修复漏洞的截止日期。

有人可以提供更多详细信息,说明除了上面链接的示例代码之外应该更新哪些内容吗?

我应该实现自定义TrustManager 吗?如果是,它应该验证什么?

【问题讨论】:

  • 嗯,这似乎包含在the Google Help Center article 中:“要正确处理 SSL 证书验证,请更改自定义 X509TrustManager 接口的 checkServerTrusted 方法中的代码,以在证书出现时引发 CertificateException 或 IllegalArgumentException服务器不符合您的期望。”您究竟是如何设置TrustManager 的?你是怎么用的?
  • @CommonsWare 与示例代码 developer.android.com/training/articles/… 完全一样我应该做些什么不同的事情吗?
  • 您链接到的页面上没有自签名服务器证书方案的代码。有未知证书授权方案的代码。
  • 如果您确实使用文档中的代码,并且您的代码中没有implements X509TrustManager,那么它可能来自您项目中的库,而不是您自己的代码。您是否在使用任何使用 Internet 访问的库(例如广告网络)?
  • @CommonsWare 我想我找到了!它在 mobilecore.jar(IronSource 广告)中。感谢您提供查看外部库的提示

标签: android security ssl android-security trustmanager


【解决方案1】:

尝试在您的代码中搜索“TrustManager”,如果没有找到,大多数情况是因为包含第三方库。

对我来说,这是因为使用的是旧版本的 ACRA (https://github.com/ACRA/acra)。

【讨论】:

  • 正如问题的 cmets 中提到的,这是一个类似的案例,使用不同的 3rd 方库
  • 有什么方法可以在编译过程中发现这个问题,比如使用 Lint 或任何静态分析工具。
  • @Pavan - 我在 Proguard 生成的 mapping.txt 中查找 checkServerTrusted。
【解决方案2】:

对我来说,问题在于 Mobilecore。我已经从应用程序中删除了库并上传了新版本的 apk,警告从 GPlay 开发控制台中消失了。

【讨论】:

    【解决方案3】:

    可能会迟到,但希望它可以帮助某人,在请求服务器之前调用此方法。如果证书不信任,你有实现对话框或其他用户可以决定的东西,这里我使用警报对话框。

    public static void trustSSLCertificate(final Activity mActivity, final DownloadPortalTask task){
            try {
                HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });
    
                SSLContext context = SSLContext.getInstance("TLS");
                context.init(null, new X509TrustManager[]{new X509TrustManager() {
                    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    }
    
                    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                        try {
                            chain[0].checkValidity();
                        } catch (final Exception e) {
    
                            mActivity.runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
                                    AlertDialog alertDialog = builder.create();
                                    alertDialog.setCancelable(false);
                                    String message = "There a problem with the security certificate for this web site.";
                                    message += "\nDo you want to continue anyway?";
                                    alertDialog.setTitle("SSL Certificate Error");
                                    alertDialog.setMessage(message);
                                    alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            acceptSSL = true;
                                            return;
    
                                        }
                                    });
    
                                    alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            acceptSSL = true;
                                            task.onInterruptedDownload();
                                        }
                                    });
                                    alertDialog.show();
    
                                }
    
                            });
    
                            while( !acceptSSL){
                                try{
                                    Thread.sleep(1000);
                                } catch( InterruptedException er) { }
                            }
    
                        }
                    }
                    public X509Certificate[] getAcceptedIssuers() {
                        return new X509Certificate[0];
                    }
                }}, new SecureRandom());
                HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
            } catch (Exception e) { // should never happen
                e.printStackTrace();
            }
        }

    【讨论】:

      【解决方案4】:

      我还发现 ARCA 4.3 似乎可能是我的应用程序的罪魁祸首。

      问题,有人知道验证问题是否已解决吗?目前,我有权访问的 Play 商店并未导致 Google 向我发出警告,但我们发布该应用程序的合作伙伴之一已收到警告。在向我们的合作伙伴提供新的 APK 之前,我想验证问题是否已解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-12
        • 1970-01-01
        相关资源
        最近更新 更多