根据 Google Play 商店在应用程序中正确的主机名验证器

Posted

技术标签:

【中文标题】根据 Google Play 商店在应用程序中正确的主机名验证器【英文标题】:Proper HostName Verifier in app according to Googe Play Store 【发布时间】:2020-08-21 02:53:17 【问题描述】:

到目前为止,我一直在使用以下代码在应用程序中调用“https”API。

 public class HttpsTrustManager implements X509TrustManager 

private static TrustManager[] trustManagers;
private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[];

@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkClientTrusted(
        X509Certificate[] x509Certificates, String s)
        throws java.security.cert.CertificateException 



@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkServerTrusted(
        X509Certificate[] x509Certificates, String s)
        throws java.security.cert.CertificateException 



public boolean isClientTrusted(X509Certificate[] chain) 
    return true;


public boolean isServerTrusted(X509Certificate[] chain) 
    return true;


@Override
public X509Certificate[] getAcceptedIssuers() 
    return _AcceptedIssuers;


public static void allowAllSSL() 
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() 

        @Override
        public boolean verify(String arg0, SSLSession arg1) 
            return true;
        

    );

    SSLContext context = null;
    if (trustManagers == null) 
        trustManagers = new TrustManager[]new HttpsTrustManager();
    

    try 
        context = SSLContext.getInstance("TLS");
        context.init(null, trustManagers, new SecureRandom());
     catch (NoSuchAlgorithmException e) 
        e.printStackTrace();
     catch (KeyManagementException e) 
        e.printStackTrace();
    

    HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());



我是 google play store 完成的 android 安全更改的新手。我从 Play Store 收到此警告:

在您的自定义 HostnameVerifier 接口中更改验证方法,以便在服务器的主机名不符合您的期望时返回 false。

我想知道我应该在应用程序或服务器中进行哪些更改?我已经尝试过堆栈溢出中存在的其他链接,但我不清楚我应该修改应用程序还是只在服务器中创建签名证书?

我能找到但不确定是否可行的解决方案

如果我添加以下代码:

 `HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() 
        @Override
        public boolean verify(String hostname, SSLSession arg1) 
            if (hostname.equalsIgnoreCase("https://xxxxxx.xx") )

                return true;
             else 
                return false;
            
        );`

那么它在Play商店中不会有任何问题吗?

【问题讨论】:

这能回答你的问题吗? Security Alert From Google For Android APP 不..我没有从这个链接中得到清晰..我已经编辑了我的问题。请检查。我不确定我正在尝试的解决方案。请看看 如果您点击链接,那么是的,提供您的应用程序使用的所有主机名。不要忘记测试和调试应用程序(在verify() 方法中放置一个断点)以确认您的应用程序在将主机名列入白名单后可以正常运行。 我担心的是 Play 商店发出的警报仅仅是因为我没有在 verify() 内的 if else 条件下提供我的域名。如果我按照编辑后的帖子中提到的那样提供这个,那么 Play 商店将不会显示错误还是应该做其他事情,比如添加证书等? 这不是 SSL 的有效或安全实现。您应该删除所有这些代码。您的allowAllSSL 唯一要做的就是完全禁用所有 SSL 安全性。这样做会使您的用户面临基于网络的窃听和攻击。 【参考方案1】:

这不是 SSL 的有效或安全实施,您提出的解决方案也不是。

正确的解决方法是删除所有这些代码。

您的allowAllSSL 方法唯一要做的就是完全禁用所有 SSL 安全性。这样做会使您的用户面临基于网络的窃听和攻击。

【讨论】:

那么如果我不使用此代码,API 调用会给出 SSL 握手异常......那么在哪里检查解决方案?应用端还是服务器端?

以上是关于根据 Google Play 商店在应用程序中正确的主机名验证器的主要内容,如果未能解决你的问题,请参考以下文章

在 Play 商店中发布后,Google 身份验证不起作用

怎么下载谷歌play

如何将国产android机添加到google play?

在 Play 商店中哪里可以找到用于私下发布应用的组织 ID

Google Play 商店内部测试无法开始推出

Google Play 商店中未显示排行榜和成就徽章