Мы должны подключиться к нашему приложению (написанному на Java 8) с каким-то очень старым сервером, используя HTTPS. Будучи Java 8, наш клиент поддерживает TLSv1.2, TLSv1.1, TLSv1 и SSLv3. Конечно, он предпочитает использовать TLSv1.2, так как это новейший протокол.
Однако сервер (Oracle-HTTP-Server 11.1.1.7) поддерживает только TLSv1 и SSLx. Кроме того, у него очень ограниченный выбор поддерживаемых наборов шифров, но есть еще один общий набор, который мы можем использовать с TLSv1: SSL_RSA_WITH_3DES_EDE_CBC_SHA (он же TLS_RSA_WITH_3DES_EDE_CBC_SHA).
Однако прямое соединение не удается, и сервер завершает рукопожатие. Вывод отладки, который мы получаем (на стороне клиента), выглядит следующим образом:
main, WRITE: TLSv1.2 Handshake, length = 265
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1.2 ALERT: fatal, close_notify
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLException: Received fatal alert: close_notify
Мне кажется, что сервер даже не пытается вернуться к TLSv1: как только клиент объявляет TLSv1.2 как предпочтительный, сервер выходит из строя.
Для сравнения, когда мы явно отключаем TLSv1.2 и TLSv1.1 в нашем клиенте, что делает TLSv1 предпочтительным вариантом, рукопожатие проходит успешно.
Мы также пытались подключиться к другой устаревший сервер, который не знает о TLSv1.2 и TLSv1.1, но здесь соединение работает, как ожидалось: хотя клиент говорит, что предпочитает TLSv1.2, они соглашаются с сервером использовать TLSv1 как лучший общий протокол:
main, WRITE: TLSv1.2 Handshake, length = 269
main, READ: TLSv1 Handshake, length = 85
...
Вопрос: Обязан ли сервер выбирать из списка протоколов TLS / SSL, поддерживаемых клиентом? Могу я сказать обслуживающему персоналу сервера, что это сервер что плохо себя ведет, не наш клиент?
Обязан ли сервер выбирать из списка протоколов TLS / SSL, поддерживаемых клиентом?
Клиент не предоставляет список поддерживаемых версий. Клиент предоставляет лучшую версию, которую он может предложить, и сервер должен ответить лучшей версией, поддерживаемой сервером, которая равна или ниже версии клиента. Если клиент не желает принимать слишком низкую версию, клиент выдаст ошибку и закроет соединение.
Могу ли я сказать обслуживающему персоналу сервера, что плохо себя ведет сервер, а не наш клиент?
Я думаю, ты можешь так сказать. Любой сервер, который правильно реализует TLS 1.0, должен иметь возможность иметь дело с подключением TLS 1.2 от клиента, потому что протокол специально разработан для этого. К сожалению, до сих пор существует достаточно неработающих реализаций TLS.