Пользовательская обработка SSL перестала работать на Android 2.2 FroYo - PullRequest
38 голосов
/ 24 мая 2010

Для моего приложения, Transdroid, я подключаюсь к удаленным серверам через HTTP и, при необходимости, через HTTPS.Для этих HTTPS-соединений с HttpClient я использую собственную реализацию фабрики сокетов SSL, чтобы убедиться, что работают самоподписанные сертификаты.По сути, я принимаю все и игнорирую каждую проверку любого сертификата.

Это уже давно работает нормально, но больше не работает для Android 2.2 FroYo.При попытке подключения он выдаст исключение:

java.io.IOException: SSL handshake failure: I/O error during system call, Broken pipe

Вот как я инициализирую HttpClient:

    SchemeRegistry registry = new SchemeRegistry();
    registry.register(new Scheme("http", new PlainSocketFactory(), 80));
    registry.register(new Scheme("https", (trustAll ? new FakeSocketFactory() : SSLSocketFactory.getSocketFactory()), 443));
    client = new DefaultHttpClient(new ThreadSafeClientConnManager(httpParams, registry), httpParams);

Я использую FakeSocketFactory и FakeTrustManager, источником которого являетсяможно найти здесь .

Опять же, я не понимаю, почему он внезапно перестал работать или даже что означает ошибка «Сломанная труба».В Твиттере я видел сообщения о том, что Seesmic и Twidroid также не работают с включенным SSL на FroYo, но я не уверен, что это связано.

Спасибо за любые указания / помощь!

Ответы [ 2 ]

41 голосов
/ 25 мая 2010

Вот ответ, во многом благодаря полезному разработчику Seesmic, готовому поделиться этим исправлением:

В фабрике нестандартных сокетов создание сокетов (с createSocket), по-видимому, было специально измененодля реализации SSLSocketFactory.Итак, старый:

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
                    throws IOException, UnknownHostException {
            return getSSLContext().getSocketFactory().createSocket();
    }

Необходимо изменить на:

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
                    throws IOException, UnknownHostException {
            return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose);
    }

И тогда он снова заработал для меня!

ОБНОВЛЕНИЕ: Поскольку это все еще популярный ответ, позвольте мне обновить мою ссылку на рабочий код. Это фабрика сокетов с поддержкой SSl , которая поддерживает современные протоколы (TLS 1.1+), SNI и дополнительно позволяет принимать все сертификаты (небезопасно, игнорирует все сертификаты SSL) или selfсертификаты (по хешу SHA-1).

1 голос
/ 02 сентября 2010

Подробнее об этой проблеме http://code.google.com/p/android/issues/detail?id=10472 Это исправило проблему SSL, которая возникла у нас в HTC Desire при обновлении до Android 2.2

...