Почему HttpUrlConnection бросает SSLException во время мобильного подключения к данным? - программирование
Подтвердить что ты не робот

Почему HttpUrlConnection бросает SSLException во время мобильного подключения к данным?

При использовании библиотеки Android HttpUrlConnection для выполнения запроса HTTPS я иногда вижу следующее исключение:

javax.net.ssl.SSLException: SSL handshake aborted: ssl=0x5c1b18a0: I/O error during system call, Connection reset by peer
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:395)
...

Покопавшись в проблеме немного, я узнал, что

  • Все работает отлично на wifi
  • Исключение возникает только тогда, когда устройство находится в мобильном соединении данных
  • После первого запуска HTTPS через Wi-Fi, подключение к мобильным данным имеет тенденцию работать нормально какое-то время
  • Проблема возникает на небольшом числе конкретных мобильных операторов.

Что может случиться? Связаны ли некоторые мобильные операторы с трафиком HTTPS?

4b9b3361

Ответ 1

Короткий ответ:

Оказывается, некоторые мобильные операторы вернут IP-адрес для поиска DNS, который должен был провалиться как несуществующий. Сервер, к которому подключалось приложение, не смог бы иногда разрешаться, и оператор попытается помочь, предоставив страницу с похожими сайтами.


Более длинный ответ:

Имя хоста для сервера, к которому подключалось мое приложение, иногда не может быть разрешено. Обычно это означает, что UnknownHostException указывает на отказ DNS. Я ожидаю, что это произойдет иногда, и приложение справится с этим. SSLException была аномалией.

На носителях, которые перехватывают неудачные поисковые запросы DNS, при навигации по веб-обозревателю к несуществующему узлу будет отображаться страница "результатов поиска", которая поможет вам найти то, что вы искали. (Некоторые провайдеры DLS/кабели тоже делают это.) Однако для приложения, выполняющего HTTPS-запрос, это нарушает SSL-квитирование, потому что удаленный хост отличается от ожидаемого приложения.

Коренной причиной стал неправильный DNS-сервер, который возвратил бы несуществующую ошибку хоста для одного из серверов, которые использовало мое приложение. Подключение через Wi-Fi казалось более надежным (из-за другой причуды одного и того же DNS-сервера). Подключение Wi-Fi позволит кэшировать запись DNS, что временно маскирует проблему, когда мы впоследствии подключаемся к мобильному соединению данных. Однако большую часть времени мобильный оператор перехватывал неудачный поиск DNS и перенаправлял нас на неожиданное имя хоста, что привело к сбою SSL-связи.