Рейтинг:0

Заголовок SNI отсутствует в TLS Client Hello при использовании HTTP-прокси

флаг ar

Я устраняю проблему с приложением на основе Java, которое извлекает полезную нагрузку JSON (список CVE из NIST) через HTTPS. Когда я подключаюсь напрямую к NIST, я успешно получаю данные. Когда я использую прокси-сервер HTTP, я получаю сообщение об ошибке TLS «неопознанное имя», указывающее на проблему с указанием имени сервера.

У меня нет доступа к коду приложения Java и минимальные возможности возиться с настройками JVM. Следовательно, я проводил отдельные тесты с использованием openssl напрямую, и я могу в некоторой степени воспроизвести проблему с этим.

Когда я выполняю tcpdump для следующего вызова, я вижу, что расширение server_name присутствует в пакете Client Hello:

openssl s_client -connect services.nvd.nist.gov:443

Wireshark показывает расширение имени сервера

Однако, если я отправлю это через свой прокси-сервер Squid и создам дамп пакетов между прокси-сервером и целевым сервером со следующим, в пакете Client Hello не будет расширения server_name:

openssl s_client -connect services.nvd.nist.gov:443 -proxy myproxy:3128

Ответ от openssl:

140012895368512: ошибка: 14094458: подпрограммы SSL: ssl3_read_bytes: нераспознанное имя tlsv1:../ssl/record/rec_layer_s3.c:1543: номер предупреждения SSL 112
---
нет доступного однорангового сертификата
---

И мы видим, что в пакете нет записи server_name:

WireShark показывает отсутствующее расширение

Я считаю, что это причина, по которой целевой сервер возвращает ошибку (хотя, насколько я понимаю, в этой ситуации он должен возвращать сертификат по умолчанию).

Теперь я могу сделать эту работу с помощью прокси, вручную указав имя сервера:

openssl s_client -connect services.nvd.nist.gov:443 -proxy myproxy:3128 -servername nvd.nist.gov

Насколько я понимаю, прокси-сервер просто туннелирует данные TLS и не должен их изменять, поэтому он предполагает, что openssl предпочитает не отправлять информацию о расширении имени сервера, когда используется прокси-сервер. С чего бы это?

(Очевидно, что в случае с openssl я могу просто указать параметр имени сервера, но с приложением Java у меня нет такой роскоши. Я надеюсь, что если я смогу понять, почему openssl предпочитает не отправлять данные SNI через прокси-сервер, это может пролить свет на то, почему Java делает то же самое.)

Steffen Ullrich avatar
флаг se
Мне кажется ошибкой, что `openssl s_client` не отправляет имя сервера по умолчанию, когда используется прокси. Но я могу воспроизвести проблему с OpenSSL 1.1.1h и 1.1.1f. Но s_client — это не Java, поэтому я бы сказал, что у этих проблем разные причины.
Gordon Mckeown avatar
флаг ar
Спасибо, что нашли время воспроизвести проблему, @SteffenUllrich. Согласитесь, у них вполне могут быть разные причины; просто кажется странным совпадением, что они оба ведут себя одинаково, поэтому мне стало интересно, есть ли что-то в использовании прокси, что диктует разное поведение TLS. Кроме того, было намного проще протестировать и объяснить проблему с помощью openssl :). Я обнаружил [ошибку] ​​(https://github.com/openssl/openssl/issues/17232) в отношении openssl.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.