Пользовательская обработка 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:
- Какие версии SSL / TLS поддерживают System.Net.WebRequest?
- Почему SSL-квитирование дает исключение «Не удалось создать DH keypair»?
- Подключение к WebSphere MQ в Java с помощью SSL / Keystore
- Как игнорировать создание пути PKIX не удалось: sun.security.provider.certpath.SunCertPathBuilderException?
- Подключение SSL / Сброс соединения с помощью IISExpress
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, но я не уверен, связано ли это.
Спасибо за любые указания / помощь!
- SSL, Tomcat и Grails
- Как исправить ошибку «java.security.cert.CertificateException: нет альтернативных имен объектов»?
- Java SSLHandshakeException «нет общих наборов шифров»
- Heroku SSL в корневом домене
- Chrome говорит: «Эта страница содержит некоторые ресурсы, которые не защищены» на всех https-сайтах
- C # Игнорировать ошибки сертификата?
- Добавить постоянное исключение SSL-сертификата в Chrome (Linux)
- CertPathValidatorException: привязка доверия для пути сертификата не найдена - обновите Android
Вот ответ, которому многие, благодаря благодарному разработчику 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