SSL не работает на Android 2.2 (только в 2.3)

1

Я получаю это в LogCat, когда httpsURLConnection.getInputStream() вызывается

Ошибка установления связи SSL: отказ в библиотеке SSL, обычно протокол ошибка ошибки: 14094412: SSL-процедуры: SSL3_READ_BYTES: sslv3 alert bad сертификат (внешний/openssl/ssl/s3_pkt.c: 1127 0x29eb40: 0x00000003)

Я тестировал его на Andorid 2.3, и он прекрасно работает.

Мой сервер требует проверки подлинности клиента! Возможно, FROYO не поддерживает это рукопожатие... Я не знаю...

Я также пытался использовать httpclient. Сбой в каждом случае...

private void process() throws Exception {

    char[] pass = "clientpass".toCharArray();

    InputStream ksStream = getAssets().open("clientKeyStore.bks");
    KeyStore keyStore = KeyStore.getInstance("BKS");
    keyStore.load(ksStream, pass);
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(keyStore, pass);
    ksStream.close();

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

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

        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    } };

    SSLContext context = SSLContext.getInstance("TLS");
    context.init(kmf.getKeyManagers(), tm, null);
    HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    });

    URL url = new URL("https://192.168.2.101:8443/RestTomcat/resources/veiculos/KKK1234");
    HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
    BufferedReader br = new BufferedReader(new InputStreamReader(httpsURLConnection.getInputStream()));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = br.readLine()) != null)
        sb.append(line + "\n");
    br.close();

    Log.e("OUTPUT", sb.toString());
    httpsURLConnection.disconnect();
}
Теги:
ssl
sockets
https

2 ответа

2

Убедитесь, что настройки даты, времени и часового пояса верны на устройстве 2.2.

  • 0
    Точно так же в обоих устройствах ... Galaxy Tab (Android 2.2) и Nexus S (Android 2.3)
0

Я не уверен, что вы нашли ответ, но это похоже на ошибку с Android 2.2, которая не должна анализировать полную цепочку сертификатов. Если у вас .p12 cert есть несколько цепей, Android 2.2, похоже, не следит за всей цепочкой.

У меня была та же проблема, что я задал вопрос в этом вопросе SO. Я попросил нашего администратора создать новый клиентский сертификат, который напрямую выдается Root CA без использования Sub CA, а затем 2.2 будет работать. Однако это ставит вопрос о безопасности наличия сертификата клиента без Sub CA в качестве посредника.

UPDATE: Команда Android подтверждает, что это проблема в 2.1/2.2. Подробности находятся в следующем отслеживании проблем

  • 0
    В моем случае у меня есть самозаверяющий сертификат ... Так я потерялся?
  • 0
    есть другой обходной путь, заменив исходную реализацию Android Socket на другую, которую я в итоге сделал, поскольку в конце они все еще хотят более безопасный Sub-CA к цепочке корневых CA. Шаги довольно сложны, но это работает (пока). Дайте мне знать, если вы заинтересованы попробовать это, и я мог бы поставить это в ответ. Я также опубликовал ошибку в Android, которая подтверждает, что это проблема в 2.1 / 2.2.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню