Инициализация соединения HTTPS/TLS
Я играл с Wireshark и заметил, что некоторые веб-сайты ведут себя по-разному при инициализации соединения https. Первым веб-сайтом, с которым я тестировал, был Bank of America, и он вел себя именно так, как я и ожидал, когда вошел в свой адресную строку "bankofamerica.com".
Поток управления был следующим:
- Отправить запрос DNS
- Установите TCP-соединение через порт 80 (TCP Handshake)
- Отправить GET / HTTP/1.1
- Получите 301 постоянно перемещен на https://www.bankofamerica.com/
- Установите TCP-соединение через 443
- Настройте TLS и отправьте данные
Это именно то, что я ожидал бы случиться. Однако, когда я ввел "facebook.com" в адресную строку, произошло следующее:
- Отправить запрос DNS
- Установите TCP-соединение через порт 443
- Настройте TLS и отправьте данные
Как это возможно, что соединение смогло пропустить HTTP-запрос, хотя я не указал HTTPS в своей адресной строке? Я попытался очистить кеш браузера, сбросить настройки маршрутизатора и даже заглянуть в DNS RFC, чтобы увидеть, был ли какой-то флаг "только https" (как я и ожидал, его не было).
Я смог сгенерировать 301 Moved Permanently (однако это было на http://www/. NOT https://www/.), Когда я использовал netcat:
nc facebook.com 80\n
GET / HTTP/1.0\n\n
Но я понятия не имею, как (даже после удаления моего кэша) он пропускает часть http в подключении к браузеру. Я беспокоюсь, что не понимаю фундаментальную часть работы http/https. Любая помощь будет оценена.
Спасибо
1 ответ
Наиболее вероятная причина в том, что вы уже посещали Facebook раньше, когда использовали этот браузер, а сервер Facebook возвращал заголовок HTTP Strict Transport Security ( HSTS).
Как только сайт вернул ответ с Strict-Transport-Security
установить, тогда браузер всегда будет идти прямо к HTTPS, даже если вы используете http://
префикс в браузере. Я узнал об этом во время экспериментов с HSTS на своем частном веб-сайте и обнаружил, что некоторым браузерам (Firefox я смотрю на вас) было очень трудно удалить настройку HSTS после ее установки.