Назад | Перейти на главную страницу

TLS 1.3 Client- / Server-Hello, версия 1.2

Я запустил 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).