Intereting Posts
ImageView вернется в исходное состояние после вращения? Читать все номера телефонов контакта в android Панель просмотра студии Android не отображается в ActionBar? Android getIntent () возвращает одно и то же намерение в onResume () каждый раз. Как очистить int field в пакете? Как я могу проверить, включен ли GPS, прежде чем пытаться его использовать? MvxListView создает привязку для макета шаблона из кода Запуск эмулятора Android в инструментах SDK, редакция 12 Должен ли getSystemService (…) результат кэшироваться? Как оживить положение прокрутки? Как прокручивать плавно? Утилита Android SDK для установки в Docker не работает Странное поведение приложения JQuery Mobile Как добавить пользовательское состояние кнопки Java.lang.NoClassDefFoundError: ayc для InterstitialAd Как принудительно использовать EditText для запуска текста в заглавной букве? Facebook – «Не удается выполнить запрос по имени пользователя»

Пользовательская обработка 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, но я не уверен, что это связано.

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

Solutions Collecting From Web of "Пользовательская обработка SSL перестала работать на Android 2.2 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 хешу).

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