Неизвестная ошибка протокола с соединением HTTPS на Android

Я звоню в службу REST, используя HTTPS в приложении Android. У меня уже есть рабочий код для этого, но теперь, когда я использую недавно установленный сервер, на котором размещена служба REST, я больше не могу устанавливать соединение.

Вот исключение:

javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x15b7768: Failure in SSL library, usually a protocol error
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x402e5cc3:0x00000000)

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

При вызове службы REST из Android Navigator соединение успешно установлено и работает нормально.

В Android-телефоне установлена ​​последняя версия 4.0.3 Android от HTC.

Служба REST - это размещенное приложение mod_perl в Apache, настроенное с поддержкой SSL.

Просмотр исходного кода OpenSSL в https://github.com/android/platform_external_openssl/blob/ics-mr0/ssl/s23_clnt.c не дает мне никаких намеков, кроме проблемы с низким уровнем.

Любое предложение о том, как отладить это дальше?

Ответ 1

Хорошо, я нашел, что проблема.

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

Поскольку сервер не отвечал в соответствии с протоколом SSL, ответ не мог быть эффективно декодирован OpenSSL и, следовательно, Unknown Protocol Error.

Для людей, желающих узнать, как я использовал OpenSSL s_client (в вашей оболочке):

$ openssl s_client -connect myhost.example.com:443 -tls1 -servername myhost.example.com

Опция -servername заверяет "Имя сервера" (SNI), чтобы гарантировать, что сервер предоставляет правильный сертификат, если на сайте есть несколько сайтов, размещенных на сервер. SNI - это опция TLS 1.0 (и выше), а также -tls1_1 и -tls1_2 тоже.

Затем отображается информация о загрузке грузовика в отношении только что открытого SSL-соединения.