如何解决 HostnameVerifier 不安全的问题?

问题引入

App提交Google Play时,审核被拒,打回,信息如下:

本文面向的是在应用中采用不安全的 HostnameVerifier 接口实施方式的开发者。在与使用 [setDefaultHostnameVerifier](https://docs.oracle.com/javase/7/docs/api/javax/net/ssl/HttpsURLConnection.html#setDefaultHostnameVerifier%28javax.net.ssl.HostnameVerifier%29) API 的远程主机建立HTTPS 连接时,这种实施方式会接受所有主机名,从而使您的应用容易受到中间人攻击。攻击者可能会读取传输的数据(例如登录凭据),甚至更改通过 HTTPS 连接传输的数据。

从 2017 年 3 月 1 日起,只要新应用或应用更新采用的 HostnameVerifier 的实施方式不安全,一律禁止在 Google Play 发布。您已发布的APK版本不会受到影响,但是,如果不解决此漏洞,您将无法为应用发布任何更新。

解决方案

需要执行的操作

为了正确处理主机名验证,请更改您的自定义 HostnameVerifier 接口中的验证方法,指定在服务器的主机名不符合您的预期时返回 False。

so,关键点就在这了,不要使用默认的HostnameVerifier或者直接return true,错误示例如下:

builder.hostnameVerifier(new HostnameVerifier() {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
});

正确校验如下:

private static String[] VERIFY_HOST_NAME_ARRAY = new String[]{};

public static final HostnameVerifier createInsecureHostnameVerifier() {
     return new HostnameVerifier() {
         @Override
         public boolean verify(String hostname, SSLSession session) {
             if (TextUtils.isEmpty(hostname)) {
                 return false;
             }
             return !Arrays.asList(VERIFY_HOST_NAME_ARRAY).contains(hostname);
         }
     };
 }

可以在VERIFY_HOST_NAME_ARRAY中添加要校验的hostname,当然也可以直接copy上述代码,绕过GP的验证。

后续步骤

使用上文中突出显示的步骤更新应用。

登录 Developer Console 并提交应用的更新版本。

过 5 个小时后再回来查看。如果应用未正确更新,系统将会显示相应的警告消息。

如有其他技术问题,您可以在 Stack Overflow 上发帖咨询(使用“android-security”标签)。请注意,请勿在 Stack Overflow 上发布关于Play 政策的问题。

请注意,应用还必须遵循开发者分发协议和内容政策。如果您认为自己不应收到这则漏洞警告消息,请通过Google Play 开发者帮助中心与我们的政策支持团队联系。

你可能感兴趣的:(android应用)