Я запустил TLS1.3-сервер через openSSL (версия 1.1.1-pre4 (бета) 3 апреля 2018 г.)
$ openssl s_server -key key.pem -cert cert.pem -accept 44330 -www -tls1_3
и клиент TLS1.3
$ openssl s_client -connect 127.0.0.1:44330 -tls1_3
Я захватил трафик через Wirehark (версия: 2.9.0-55):
Почему обнаружена / определена версия 1.2 относительно протокола рукопожатия и даже 1.0 для уровня записи?
Читая rfc-draft, Я нашел это:
Чтобы максимизировать обратную совместимость, записи, содержащие исходный ClientHello, ДОЛЖНЫ иметь версию 0x0301, а запись, содержащая второй ClientHello или ServerHello, ДОЛЖНА иметь версию 0x0303, отражающую TLS 1.0 и TLS 1.2 соответственно.
Глядя на мой pcap, эта запись, содержащая второй ClientHello, не может быть найдена. И следующий ServerHello действительно версия 0x0303.
Но похоже, что клиент и сервер все-таки говорят на TLS1.3:
Я в этом не разбираюсь. Вы можете помочь мне?
Потому что плохие реализации сломались, когда были представлены 1.3.
Cloudflare: почему TLS 1.3 еще нет в браузерах
При представлении приветствия клиента с версией 3.4 большой процент серверов с поддержкой TLS 1.2 отключается вместо ответа 3.3. Интернет-сканирование, проведенное Ханно Беком, Дэвидом Бенджамином, SSL Labs и другими, подтвердило, что частота отказов TLS 1.3 была очень высокой, более 3% во многих измерениях.
Спорный выбор заключался в том, чтобы принять предложение Дэвида Бенджамина сделать первое сообщение TLS 1.3 (приветствие клиента) похожим на TLS 1.2. Номер версии клиента был изменен обратно на (3, 3), и было введено новое расширение «версия» со списком поддерживаемых версий внутри. Сервер вернет приветствие сервера, начиная с (3, 4), если поддерживается TLS 1.3, и (3, 3) или ранее в противном случае. Проект 16 TLS 1.3 содержал эту новую и «улучшенную» логику согласования протокола.
Первоначальный механизм согласования протокола сгорел безвозвратно. Это означает, что его, скорее всего, нельзя будет использовать в будущей версии TLS без серьезных сбоев.
Второй клиентПривет отправлен только в случае, если сервер запрашивает его - он отправляется как ответ на сообщение HelloRetryRequest.
Если ключ DH используется совместно с key_shares
расширения приемлемы для сервера, он не будет запрашивать у клиента второй ClientHello, если это не так, но клиент объявил о поддержке других групп (в supported_groups
extension), которые приемлемы, сервер запросит у клиента второй ClientHello, отправив HelloRetryRequest с группой, которую клиент должен отправить. Если ни одна из групп в supported_groups
расширение приемлемо для сервера, оно отклонит соединение с handshake_failure
alert (если он соответствует RFC).
примечание: реальная объявленная и согласованная версия протокола живет в supported_versions
расширение (именно так Wireshark узнает, что это соединение TLS 1.3, хотя ServerHello.version имеет в нем значение 0x0303).