Правильный верификатор имени хоста в приложении в соответствии с Google Play Store

До сих пор я использую следующий код для вызова API-интерфейсов https в приложении.

 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());
}

}

Я новичок в изменениях безопасности Android, сделанных магазином Google Play. Я получаю это предупреждение из 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;
            }
        }});`

тогда не будет ли это проблем в игровом магазине?


person S.Ambika    schedule 06.05.2020    source источник
comment
Отвечает ли это на ваш вопрос? Оповещение о безопасности от приложения Google для Android   -  person Andrew T.    schedule 06.05.2020
comment
Нет .. Я не получаю ясности по этой ссылке .. Я отредактировал свой вопрос. Пожалуйста, проверьте. Я не уверен в решении, которое я пытаюсь использовать. Пожалуйста, посмотрите   -  person S.Ambika    schedule 06.05.2020
comment
если вы перейдете по ссылке, то да, при условии, что все имена хостов использует ваше приложение. Не забудьте протестировать и отладить приложение (поставьте точку останова внутри метода verify()), чтобы убедиться, что ваше приложение будет работать правильно после добавления имен хостов в белый список.   -  person Andrew T.    schedule 06.05.2020
comment
Меня беспокоит то, что предупреждение, выдаваемое игровым магазином, связано только с тем, что я не указал свое доменное имя в соответствии с условием if else внутри verify (). Если я предоставлю это, как указано в отредактированном сообщении, тогда игровой магазин не будет отображать ошибку или есть что-то еще, что должно быть сделано как добавление сертификата и т. д.?   -  person S.Ambika    schedule 06.05.2020
comment
Это недопустимая или безопасная реализация SSL. Вы должны удалить весь этот код. Единственное, что делает ваш allowAllSSL, это полностью отключает всю безопасность SSL. Делая это, вы открываете своих пользователей для сетевого прослушивания и атак.   -  person Ryan M    schedule 06.05.2020


Ответы (1)


Это недопустимая или безопасная реализация SSL, равно как и предлагаемое вами решение.

Правильное решение — удалить весь этот код.

Единственное, что делает ваш метод allowAllSSL, это полностью отключает всю безопасность SSL. Делая это, вы открываете своих пользователей для сетевого прослушивания и атак.

person Ryan M    schedule 06.05.2020
comment
то, если я не использую этот код, вызов API дает исключение для рукопожатия SSL..тогда где искать решение? на стороне приложения или на стороне сервера? - person S.Ambika; 07.05.2020