Подключение к домашнему серверу по https — работает с WiFi, но не с 3G

У меня очень странная проблема с моим телефоном (Alcatel 997D под управлением Android 4.0.4). Позвольте мне начать с самого начала. Я предоставляю определенные услуги (в основном, синхронизацию, Firefox и Cal/CardDAV) на сервере с самозаверяющими ключами SSL, который находится в моей домашней сети. Чтобы обеспечить подключение, я проделал небольшую дыру в брандмауэре моего маршрутизатора и зарегистрировал домен, который регулярно устанавливается на мой IP-адрес WAN.

Все работало нормально некоторое время назад (6 месяцев, я думаю). Но теперь мой телефон не может подключиться к моему серверу, когда он использует соединение 3G (со всеми приложениями синхронизации, приложениями синхронизации Firefox, Cal/CardDAV, Firefox с моим IP-адресом WAN в качестве адреса), но все работает нормально, когда я подключаюсь через локальная беспроводная сеть.

По сути, единственное, что я изменил, — это ключи SSL на моем сервере, и, возможно, я установил на телефон небольшие обновления Android. Чтобы исключить проблему с сетью 3G, я сделал еще одну дыру в брандмауэре моего маршрутизатора и отправил трафик на один из моих других компьютеров (отображая небольшую веб-страницу по http). К моему удивлению, телефон смог подключиться к странице через 3G.

Это очень беспокоит. Чтобы исключить, что проблема связана с телефоном, мне все равно нужно проверить подключение 3G на другом компьютере и попытаться подключиться к моему серверу через чужую WLAN.Но на всякий случай: как я могу получить больше информации на стороне Android? Все приложения предоставляют более или менее бессмысленный вывод.

Погуглив, я обнаружил, что для отладки доступно больше вариантов, например установка curl. Я так и сделаю, но все равно задам этот вопрос в надежде, что кто-то видел что-то подобное, или может указать мне на тривиальную ошибку с моей стороны.


В системном журнале есть ошибки, которые указывают на проблемы с квитированием SSL через соединение 3G. Вот некоторые записи журнала:

[ 08-24 12:30:02.508 19763:0x4d6c E/NativeCrypto ]
Unknown error during handshake
[ 08-24 12:30:08.274 19763:0x4d6c E/NativeCrypto ]
Unknown error during handshake
[ 08-24 12:30:08.275 19763:0x4d6c W/System.err ]
javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x18e8508: Failure in SSL library, usually a protocol error
[ 08-24 12:30:08.275 19763:0x4d6c W/System.err ]
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x4027f522:0x00000000)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:460)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
    at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:486)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
    at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:450)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
    at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:194)
[ 08-24 12:30:08.276 19763:0x4d6c W/System.err ]
    at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280)

[…]

Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x18e8508: Failure in SSL library, usually a protocol error
[ 08-24 12:30:08.277 19763:0x4d6c W/System.err ]
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x4027f522:0x00000000)
[ 08-24 12:30:08.278 19763:0x4d6c W/System.err ]
    at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
[ 08-24 12:30:08.278 19763:0x4d6c W/System.err ]
    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:410)
[ 08-24 12:30:08.278 19763:0x4d6c W/System.err ]

Соединение с другими страницами SSL, например надстройками Mozilla, работает с 3G. Итак, я предполагаю, что в моих ключах SSL есть что-то, что не нравится телекоммуникационной компании или Android. Я проведу несколько тестов с другими устройствами и ключами.


Я протестировал сеть 3G моего провайдера с мобильным USB-модемом, подключенным к моему Mac, и все просто работало, календарь, адресная книга и т. д. (я отключил Ethernet и WLAN на Mac, и приложение, предоставленное телефонной компанией, показало пропускную способность 1 МБ, и все было немного вяло). Я думаю, это доказывает, что Android имеет какое-то отношение к этому беспорядку.


Хорошо, кое-что, что только что пришло мне в голову: у меня было одно приложение, используемое для синхронизации календаря, которое больше не могло синхронизироваться через WLAN после переключения SSL-сертификата. Он выдал исключение, которое жаловалось на неподдерживаемое или неизвестное критическое расширение. Я думаю, что это ключ к решению проблемы.


Я изменил свой сертификат сервера и разрешил Android доверять ЦС, теперь у меня нет проблем с ненадежными сертификатами через WLAN, однако проблема с 3G остается. я накопал про это

SSL23_GET_SERVER_HELLO:unknown protocol

в соответствии с этим ошибка: 140770FC, которую я получил, указывает на проблему с DNS, что объясняет, почему это происходит только через 3G, но не почему этого не происходит на Mac.

Чтобы собрать немного больше информации, я попытался открыть одну из своих веб-страниц в Chrome. Он выпустил

Error 111 (net::ERR_TUNNEL_CONNECTION_FAILED)

который был связан с проблемами SSL здесь , но я не могу признать, что ошибка исчезает после переключения на стандартный порт. Мне нужны лучшие инструменты для дальнейшего расследования, возможно, я задам другой вопрос позже.

Последний блок дает некоторые подсказки: SSL handshake aborted: ssl=0x18e8508: Failure in SSL library, usually a protocol errorи routines:SSL23_GET_SERVER_HELLO:unknown protocol, что подтверждает, что ваша проблема заключается в части SSL. Странно, что этого не происходит на WiFi. Есть ли у вас возможность попробовать другого провайдера 3G? Поскольку этого не происходит в WiFi, это должно быть что-то на их конце. Также: Вам вручили сертификат? Если это так, я бы внимательно рассмотрел его и сравнил с тем, что вы ожидаете здесь.
@Izzy К сожалению, я даже не дошел до стадии сертификата в Firefox, при использовании 3G соединение вообще не устанавливается. В ближайшие дни я проведу несколько других тестов и обновлю свой вопрос в соответствии с моими выводами.
Просто приходит мне на ум: может быть, это какая-то проблема с «отображением портов» в NAT вашего провайдера? Возможно, ваши эксперименты должны включать привязку служб к другому порту. Использование другой SIM-карты (лучше от другого провайдера) также может дать некоторые интересные результаты. Поскольку вы даже не достигли «этапа сертификата»: вы проверяли журналы на своих серверах, есть ли вообще входящий запрос? Они также могут раскрывать полезные детали.
@Izzy Я протестировал сеть 3G моего провайдера с мобильным USB-модемом, подключенным к моему Mac, и все просто работало, календарь, адресная книга и т. Д. (Я деактивировал Ethernet и WLAN на Mac, и приложение телекоммуникационной компании показало пропускную способность 1 МБ, и все как-то вяло). Я думаю, это доказывает, что Android имеет какое-то отношение к этому беспорядку. Я тщательно проверяю журналы своего сервера, возможно, задействован NAT.

Ответы (1)

Поскольку вы говорите, что проблема существует только в 3G, а не в WiFi, это, вероятно, связано с какой-то проблемой с точкой доступа вашего сетевого провайдера. Когда-то я столкнулся с подобной проблемой, потому что точка доступа по умолчанию имела прокси-сервер, который не разрешал туннелирование SSL. После удаления порта и прокси с точки доступа эта проблема была решена.

Источник: http://lifepluslinux.blogspot.in/2015/07/errtunnelconnectionfailed-on-mobile.html .