TLS в HTTP/2

Я написав огляд «http2 explained» і зробив кілька виступів з приводу HTTP/2. Після цього я отримав багато запитань з приводу зв'язки TLS і HTTP/2, тому я хотів би відповісти на деякі з них у цій статті.

TLS не обов'язковий

У схваленій специфікації HTTP/2, яка скоро стане офіційним RFC, немає нічого про обов'язкове використання TLS. Навпаки, там розповідається, як можна передавати дані відкритим текстом TCP, і як - через TLS.

За фактом TLS буде використовуватися завжди

Незважаючи на попередній абзац, представники розробників Firefox і Chrome оголосили, що вони будуть реалізовувати підтримку HTTP/2 тільки через TLS. Тому, HTTP/2 буде підтримуватися тільки для URL типу HTTPS://. Розробники IE говорили, що вони впровадять підтримку і по TCP, але в їх технологічному превью Windows 10 браузер підтримував тільки HTTP/2 через TLS. Більшість існуючих серверів підтримують HTTP/2 через TLS

Потрібно зрозуміти різницю між тим, що дозволяє специфікація і тим, що реально підтримується браузерами.

Якщо ви розробляєте сервер для HTTP/2, то вам, загалом, доведеться реалізовувати його для HTTPS, щоб у вас були якісь користувачі. А реалізація без шифрування не буде особливо сильно тестуватися...

Звичайно, агентами можуть бути не тільки браузери, але їх частка буде перевершувати всі інші.

Суворіша реалізація TLS

При описі HTTP/2 через TLS, специфікація висуває більш жорсткі вимоги, ніж ті, що були зроблені для HTTP 1.1 через TLS. Наприклад, TLS зобов'язана бути версією не нижче 1.2. Специфікація забороняє стиснення і ренегоціації. Визначає мінімальний розмір ключів. Простіше кажучи, в HTTP/2 буде використовуватися більш безпечна версія TLS.

Крім іншого, в специфікації обов'язкова підтримка ALPN - щодо нового розширення TLS, RFC 7301, яка допомагає визначати нову версію HTTP без втрат часу або відправки зайвих пакетів.

Обов'язковість TLS заохочує HTTPS

Оскільки браузери будуть використовувати тільки HTTP/2 через TLS, сайтам доведеться приймати користувачів за HTTPS. Це невеликий тиск на власників сайтів з тим, щоб вони починали надавати HTTPS. Більше людей переходять на захищені з'єднання.

Я вважаю, що це добре і правильно - і так само вважають всі, хто піклується про користувачів і про їх право на приватність, і право уникати масового стеження.

А чому не зробити TLS обов'язковим?

При створенні специфікації ми не досягли угоди з питання обов'язковості цього протоколу. Багато хто був проти. До цього TLS ніколи не був обов'язковим.

Люди пояснювали свої заперечення по-різному.

1. Можлива потреба відстеження трафіку

Деякі говорять про те, що іноді потрібно відстежувати трафік. В'язниці, школи, антивірусні програми, захист копірайту, законні вимоги, тощо. Крім того, іноді необхідно кешування - не можна зробити пристойно працюючий інтернет в літаку або через супутник і т. п. без кешування, а значить, без перехоплення трафіку.

Звичайно, проксі MITM, які вбудовуються в SSL-трафік, і зараз зустрічаються, тому HTTP/2 може зробити небагато в плані обмеження таких механізмів.

2. Згадайте про малюків

«Мініатюрні пристрої не зможуть впоратися з додатковим навантаженням у вигляді шифрування». Або через навантаження на CPU, або через необхідність обробляти купу сертифікатів, які до того ж періодично застарівають.

3. Сертифікати - це дорого

Вартість сертифікатів завжди наводилася як аргумент проти TLS - навіть без відношення до HTTP/2. Зараз вже є такі CA, які пропонують безкоштовні або дешеві сетифікати, а в майбутньому ініціативи начебто letsencrypt.com зроблять життя ще простішим.

4. Система CA не працює

Сьогодні для роботи TLS потрібна інфраструктура відкритих ключів, де є організації, що підписують сертифікати. У результаті браузери довіряють кільком сотням організацій. Не думаю, що всім це подобається, і що це - найкраще рішення для безпеки. Дехто вважає, що цю проблему треба вирішувати через DANE (DNSSEC), інші працюють над заплатками на кшталт Certificate Transparency OCSP.

Особисто я вважаю, що відкидати TLS тому, що він не досконалий - це слабкий аргумент. Кращих способів для забезпечення безпеки сайтів, ніж TLS і HTTPS, у нас поки немає. Я не проти поліпшення цих способів, але не робити ж тепер все по незахищених каналах, поки ми не придумаємо наступне, краще покоління протоколів, які замінять TLS.

Як щодо «безпеки по можливості» (opportunistic security)?

В IETF зараз йде робота над введенням такої можливості в протоколи. Вона також була включена в чернетку HTTP/2, хоча потім для простоти ми її звідти прибрали. У будь-якому випадку, вона не зобов'язана входити в основну специфікацію. Крім того, далеко не всі вважають таку можливість хорошою ідеєю.

Зараз безпеку по можливості зараз розробляють для HTTP поза специфікацією HTTP/2. Вона дозволяє клієнту апгрейдити звичайне з'єднання по TCP до «неавторизованого TLS». Так, і звичайно, не потрібно позначати таку сполуку, як безпечне - ніякої «іконки з замочком» або іншого індикатора безпеки показувати не слід.

У Firefox буде увімкнено підтримку таких з "єднань для типового HTTP, починаючи з версії 37.

logo

Follow us