Android 根据Googe Play Store在应用程序中使用正确的主机名验证程序

Android 根据Googe Play Store在应用程序中使用正确的主机名验证程序,android,https,android-security,sslhandshakeexception,Android,Https,Android Security,Sslhandshakeexception,到目前为止,我一直在使用以下代码来调用应用程序中的“https”API public class HttpsTrustManager implements X509TrustManager { private static TrustManager[] trustManagers; private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{}; @SuppressLint("TrustAl

到目前为止,我一直在使用以下代码来调用应用程序中的“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());
}

}
我对谷歌play store进行的安卓安全更改还不熟悉。我从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 store中产生任何问题吗?

这不是有效或安全的SSL实现,也不是您建议的解决方案

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


您的
allowalsl
方法所做的唯一事情就是完全禁用所有SSL安全性。您这样做是在向用户开放基于网络的窃听和攻击。

这是否回答了您的问题?不我没有从这个链接中获得清晰的信息。我已经编辑了我的问题。请检查。我不确定我正在尝试的解决方案。请看一看,如果您遵循这个链接,那么是的,提供了您的应用程序使用的所有主机名。别忘了测试和调试应用程序(在
verify()
方法中放置一个断点),以确认在将主机名列入白名单后,应用程序将正常运行。我担心play store发出的警报只是因为我没有在verify()中的if else条件下给出我的域名。如果我按照编辑后的帖子中所述提供此选项,则play store将不会显示错误,或者应该执行其他操作,如添加证书等?这不是有效或安全的SSL实现。您应该删除所有这些代码。您的
allowalsl
所做的唯一一件事就是完全禁用所有SSL安全性。您这样做是在向您的用户开放基于网络的窃听和攻击。那么,如果我不使用此代码,API调用将导致SSL握手异常。那么在哪里检查解决方案?应用程序端还是服务器端?