Ошибка SSL в Android: сертификат не является доверенным… иногда - PullRequest
4 голосов
/ 28 декабря 2011

В приложении, над которым я работаю, я должен установить HTTPS-соединение с веб-сервером.Я получал сертификат, не являющийся доверенным, и после консультации со стековым потоком я обнаружил следующую запись в блоге: http://blog.antoine.li/index.php/2010/10/android-trusting-ssl-certificates/

Похоже, что CA для этого сервера не включен в хранилище Android по умолчанию.Короче говоря, я скачал все сертификаты, создал хранилище ключей с поставщиком BKS, импортировал ключи, импортировал хранилище ключей в свой проект, вложил в класс DefaultHttpClient, чтобы заставить его использовать мое хранилище ключей.

После выполненияшаги в блоге, он отлично работал на эмуляторе.Однако, когда я тестирую его на устройстве, оно периодически дает сбой.Я думаю, что я выделил образец.Кажется, что через некоторое время, и я пытаюсь установить HTTPS-соединение, оно не будет установлено.Затем, если я попытаюсь снова подключиться к тому же соединению, оно будет успешным.Если я подожду некоторое время, а затем попробую еще раз, то это не удастся в первый раз, но удастся при повторных попытках.Я, вероятно, могу это исправить, просто сделав несколько попыток неудачи, но я хотел бы знать, что происходит.Поведение предполагает какой-то кэш, но я не знаю, как его найти или изменить его поведение.У кого-нибудь есть предложения по поводу того, что происходит, или знаете, что я делаю не так?Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Чистые предположения, но я имел дело с подобными ситуациями некоторое время назад в среде Windows / IE, где сертификат периодически прерывался. В обоих случаях у меня были прокси-серверы, которые, как я не осознавал, действовали как прокси-серверы.

Первым был Fiddler - веб-отладчик, который передавал сертификат браузеру, когда я включил его.

Во второй раз у меня возникла проблема с нашим корпоративным решением для интернет-фильтрации (Web Sense), также работающим в качестве прокси-сервера, вроде бы - оно позволяло бы корректно проходить сертификационную информацию, но не с первой попытки.

Я не знаю, является ли это вашим случаем, но это единственный раз, когда я видел поведение, подобное тому, что вы описываете.

0 голосов
/ 28 августа 2013

Перед открытием соединения вы можете создать TrustManager, который не проверяет цепочки сертификатов, и установить его на HttpsURLConnection. Смотри ниже:

`

private static void trustAllHosts() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[] {};
        }

        public void checkClientTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
        }
    } };


    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection
                .setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...