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

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

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

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

Ответы [ 2 ]

4 голосов
/ 05 мая 2011

Я решил похожую проблему, установив

System.setProperty("http.keepAlive", "false");

до того, как сделал HTTP-вызовы.Кажется, проблема в том, что Android удерживает закрытые соединения в своем пуле соединений и пытается их повторно использовать.

0 голосов
/ 30 марта 2011

Вы можете «пропустить» сертификаты.Да, вы потеряете безопасность, но иногда это единственное решение ...

Чтобы сделать это.Во-первых, объявите TrustManager:

    private TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager()
    {
        public java.security.cert.X509Certificate[] getAcceptedIssuers()
        {
            return null;
        }

        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
        {

        }

        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
        {

        }
    }
};

Во-вторых, измените контекст SSL:

            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

Я надеюсь помочь вам.

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