Ошибка SSL Handshake для версии Android 2.2 - PullRequest
1 голос
/ 17 февраля 2012

Я занимаюсь разработкой приложения, которое требует проверки сертификата с сервера.Он отлично работает на Android 2.3 и выше, но для Android 2.2 он дал мне исключение:

W/System.err( 2116): java.io.IOException: SSL handshake failure: Failure in SSL library, usually a protocol error
W/System.err( 2116): error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure (external/openssl/ssl/s3_pkt.c:1053 0x3a5208:0x00000003)
W/System.err( 2116):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeconnect(Native Method)
W/System.err( 2116):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:305)
W/System.err( 2116):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl.java:502)
W/System.err( 2116):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:443)

Эта ошибка возникла из BufferedInputStream, когда устройство пытается извлечь InputStream из SSLSocket.Код ниже:

BufferedInputStream getSocketReader() throws IOException {
BufferedInputStream bis = new BufferedInputStream(sslSocket.getInputStream(), 32768);
        return bis;
    }

Вот мой текущий код метода createEasySSLContext ():

private static SSLContext createEasySSLContext() throws IOException {
    try {
        SSLContext context = SSLContext.getInstance("TLS");
        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(sampleKeystore, "password".toCharArray());

        CustomX509TrustManager trustManager = new CustomX509TrustManager(null);
        context.init(keyManagerFactory.getKeyManagers(), new TrustManager[]{trustManager}, null);
        return context;
    } catch (Exception e) {
        throw new IOException(e.getMessage());
    }
}

Как это происходит?Можно ли это исправить, не потеряв поддержку Android 2.2?Спасибо.

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Скорее всего ЦС, выдавший сертификат вашего сервера, не пользуется доверием Android 2.1. Либо получите новый сертификат, либо создайте хранилище доверенных сертификатов, содержащее сертификат CA, и настройте свой код для его использования.

Больше информации и пример кода здесь .

0 голосов
/ 17 февраля 2012

Мне кажется, что сертификат от сервера не в форме, которая распознается в 2.1. Вы можете исправить это, изменив алгоритм сертификата или шифра, который вы используете на стороне сервера.

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