Пользовательский SSL, обрабатывающий остановленную работу над Android 2.2 FroYo

Для моего приложения, 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 также, но не уверены, если это связано.

Спасибо за любые направления/справку!

38
задан Jagat Dave 22 June 2016 в 10:46
поделиться

1 ответ

Вот ответ, и огромное спасибо полезному разработчику 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) или самостоятельно -подписанные сертификаты (по хешу SHA-1).

42
ответ дан 27 November 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: