Код статусу HTTP сигналізує про поганий або відсутній заголовок хоста


6

Чи є код статусу HTTP, який доцільно використовувати для клієнтів, які надсилають неправильне ім’я хоста (або взагалі жодне) через SNI або заголовок HTTP Host?

Старше питання адреса , як і чому такі запити відбуваються в першу чергу , а також як можна технічно впоратися з ними в Apache. Однак він не стосується вибору коду статусу для відповіді.

Раніше я реалізував проксі-сервер HTTP, який надсилав би код статусу 502 та сторінку html, що пояснює, чому було створено повідомлення про помилку. Моє обґрунтування використання 502 було сподіванням, що я в основному бачу це через неправильні конфігурації, що означало, що проксі не може знайти відповідний сервер. Насправді виявилося набагато частіше просто бачити цілком неправдиві імена хостів.

Чи є інший код статусу, який є більш відповідним і чітко сигналізує клієнту, що сервер за цією IP-адресою не розпізнає значення, надіслане через SNI та / або заголовок хоста?


Чому саме турбота про відповідність SNI? SNI приносить користь клієнту, і тільки клієнту. Клієнт запитує сертифікат, який існує, але він підтверджує невідповідне ім'я домену? Тому? Безумовно, ніякої шкоди для сервера. Просто дайте клієнтам можливість пройти автентифікацію на той дивний спосіб; можливо, вони хочуть отримати вміст google.com, засвідчений сертифікатом facebook.com. Хто знає. Лише заголовок хоста є справжнім питанням безпеки у цьому питанні.
kubanczyk

@kubanczyk У мене є проксі, який використовує SNI, щоб знайти потрібний сервер, який припинить TLS-з'єднання. Без правильного імені хоста в SNI від клієнта проксі нікуди не припиняти TLS-з'єднання. До цих пір він просто закривав би такі TCP-з'єднання, нічого не надсилаючи. Але за допомогою Майкла відповіді , я міг би замість того, щоб припинити цей TLS з'єднання на хості, який відповідає за фіксованими 7 байтами TLS повідомленням {0x15, 0x03, 0x03, 0x00, 0x02, 0x02, 0x70}.
kasperd

Це мета заголовка "Хост", а не призначення SNI. Якщо ви дивитесь на SNI, але ігноруєте заголовок "Host", ви не сумісні з RFC. Якщо вам потрібен SNI, ви порушите сумісність зі старими клієнтами. SNI вказує, що клієнт хоче конкретний сертифікат , а не конкретний веб-сайт .
kubanczyk

@kubanczyk Заголовок Host надсилається надто пізно та зашифровано, тому SNI було введено в першу чергу. Будь-який клієнт, який занадто старий для підтримки SNI, швидше за все, буде корисним в Інтернеті сьогодні з багатьох інших причин. Крім того, я не вимагаю, щоб клієнти мали SNI, тільки клієнти, які вирішили використовувати IPv4, потребують SNI. Клієнти можуть підключитися за допомогою IPv6, і все буде чудово працювати без SNI.
kasperd

Відповіді:


13

RFC 6066 не вказує і навіть не рекомендує будь-яку конкретну помилку HTTP у випадку, якщо ім'я хоста, надіслане через SNI, не відповідає заголовку HTTP Host. Це дійсно рекомендується, щоб сервер перервати рукостискання TLS , якщо ім'я хоста SNI не один , що він надає послугу. З розділу 3 :

Якщо сервер зрозумів розширення ClientHello, але не розпізнає ім'я сервера, СЕРЕДУ слід виконати одну з двох дій: або перервати рукостискання, надіславши попередження про невизнане ім'я фаталу (112) фатального рівня, або продовжуйте рукостискання.

Оскільки такий неправильний запит може пройти через рукостискання TLS і його потрібно відхилити в HTTP, необхідний код відповіді HTTP. З усіх існуючих лише одна справді відповідає ситуації:

6.5.1. 400 Поганий запит

Код стану 400 (поганий запит) вказує на те, що сервер не може або не обробляє запит через те, що сприймається як помилка клієнта (наприклад, синтаксис неправильного запиту, неправильне обрамлення повідомлення запиту або оманливе маршрутизація запиту).

Фактично це відповідь, яку визначає RFC 7230. З розділу 5.4, що описує заголовок хоста:

Сервер ПОВИНЕН відповісти кодом статусу 400 (неправильний запит) на будь-яке повідомлення запиту HTTP / 1.1, у якому відсутнє поле заголовка хоста, і на будь-яке повідомлення запиту, що містить більше одного поля заголовка хоста або поле заголовка хоста з недійсним значенням поля .

Я настійно рекомендую не використовувати 502 для цього. Її семантика вказує на те, що на стороні сервера щось не так і що запит буде успішним, якщо його спробувати пізніше.


unrecognized_nameдля мене має бути банальним для впровадження та однозначного покращення порівняно з тим, як я ставлюсь до цього сценарію в даний час. Що стосується коду HTTP, то мій проксі не обов'язково знає, чи проблема лежить на стороні клієнта або на сервері проксі, може бути неправильно налаштована DNS-запис. Тож ваша відповідь загалом звучить добре, але я детальніше оціню цю частину, перш ніж застосувати її до мого конкретного випадку використання.
kasperd

Я думаю, що головне рішення тут полягає в тому, що клієнту повинно бути зрозуміло, що проблема існує на стороні клієнта. невпізнане_ ім’я та 400 роблять це.
Майкл Хемптон

Моє занепокоєння щодо використання коду статусу 400 полягає в тому, що проблема не обов'язково стосується клієнта. Проблема може бути через неправильно налаштовані записи DNS. Також код 400 не однозначно повідомляє клієнту, що заголовок Host - це те, що сервер не любить. Я реалізував, unrecognized_nameяк було запропоновано (у мене був старий фрагмент коду, який просто потребував зовсім незначної зміни, щоб зробити саме це). І принаймні в Chromium це трактується більш-менш ідентично проблемі з підключенням до мережі, але, принаймні, йдеться про повідомлення про помилку ERR_SSL_UNRECOGNIZED_NAME_ALERT.
kasperd

У вас завжди є можливість детальніше описати проблему в органі відповіді. Коди помилок HTTP недостатньо деталізовані для того, що потрібно.
Майкл Хемптон

Я весь час надсилаю такий опис у відповідь, хоча тільки для HTTP. Схоже, що в поточному стандарті немає нічого більш деталізованого. Я не можу сказати з формулювання, чи недійсне значення поля просто повинно охоплювати щось синтаксично неправильне або якщо воно також повинно охоплювати ідеально правильні імена DNS, які просто буває, що не налаштовано на сервері.
kasperd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.