Пользовательская обработка 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, источник которых можно найти здесь .

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

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

Вот ответ, которому многие, благодаря благодарному разработчику 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 hashу).

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

  • Как установить доверенный сертификат CA на Android-устройство?
  • Как заставить прокси-сервер charles работать с nougat 7 Android?
  • Как создать самозаверяющий сертификат с openssl?
  • Непосредственно считывать / записывать данные подтверждения с помощью памяти BIO
  • SSLHandshakeException: сообщение о нарушении не выполнено на Android N / 7.0
  • Где получить сертификаты для Acrobat PDF
  • Почему запросы Python игнорируют параметр проверки?
  • Java-соединение и HTTPS-соединение без скачивания сертификата
  • Запрос Python, бросающий SSLError
  • Https Connection Android
  • Страницы SSL в ASP.NET MVC
  • Interesting Posts

    Как сделать Bash моей оболочкой по умолчанию на Ubuntu?

    Команда Bash Run на определенное время?

    Подключение к компьютерам в другой сети маршрутизатора

    Патч обычный вызов в delphi

    Разница между выключением (выключение) и перезагрузкой (перезагрузка)

    Удалить текст между разделителями в строке (с использованием регулярного выражения?)

    Почему некоторые веб-сайты добавляют «Slugs» в конец URL-адресов?

    Как развернуть Java-апплет для современных браузеров (апплет, встраивание, объект)?

    Как узнать, из какой программы поступает сигнал по умолчанию в Windows 7?

    Является ли CSS3 официальным стандартом?

    Миниатюры панели задач Windows 7 не отображаются

    Как записать файл в Scala?

    Почему использование имени функции в качестве указателя функции эквивалентно применению оператора адреса к имени функции?

    Являются ли IP-адреса с и без ведущих нулей одинаковыми?

    Выгрузите сборку, загруженную Assembly.LoadFrom ()

    Давайте будем гением компьютера.