Неизвестная ошибка протокола с соединением 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-соединения.