Я написав огляд «http2 explained» і зробив кілька виступів з приводу HTTP/2. Після цього я отримав багато запитань з приводу зв'язки TLS і HTTP/2, тому я хотів би відповісти на деякі з них у цій статті.
- TLS не обов'язковий
- За фактом TLS буде використовуватися завжди
- Суворіша реалізація TLS
- Обов'язковість TLS заохочує HTTPS
- А чому не зробити TLS обов'язковим?
- 1. Можлива потреба відстеження трафіку
- 2. Згадайте про малюків
- 3. Сертифікати - це дорого
- 4. Система CA не працює
- Як щодо «безпеки по можливості» (opportunistic security)?
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.



