HPKP — це застарілий заголовок відповіді веб-безпеки, абревіатура означає PIN-код відкритого ключа HTTP. Він мав на меті запобігти скомпрометованому або шахрайському центру сертифікації від видачі загальнодоступного, але контрольованого хакерами сертифіката HTTPS для веб-сайту. У цьому випадку хакери зможуть розшифрувати будь-який перехоплений HTTPS-трафік на уражений веб-сайт.
Порада: заголовки веб-відповідей — це фрагменти метаданих, які сервер включає під час відповіді на запити. Невелика підмножина з них називається заголовками безпеки, оскільки вони вмикають і налаштовують різні функції безпеки.
Інфраструктура сертифікатів HTTPS
Інфраструктура сертифікатів, на якій побудовано HTTPS, заснована на мережі довіри. Деякі компанії діють як центри сертифікації (CA), які публікують один або кілька кореневих сертифікатів. Набір кореневих сертифікатів включено в усі пристрої в довіреному сховищі. Коли веб-сайт запитує власний сертифікат HTTPS від ЦС, сертифікат підписується кореневим сертифікатом. Коли ваш комп’ютер бачить сертифікат HTTPS, він перевіряє підпис. Якщо сертифікат підписаний кореневим сертифікатом, якому він довіряє, ваш комп’ютер також довіряє сертифікату HTTPS.
Порада: ЦС також може мати проміжні сертифікати, підписані кореневим сертифікатом. Ці проміжні сертифікати також можна використовувати для підписання сертифікатів HTTPS для веб-сайтів.
Завдання центру сертифікації — видавати сертифікат лише тоді, коли вони підтвердили, що особа, яка їх запитує, є справжнім власником веб-сайту. Ідея цієї структури полягає в тому, що якщо хакер створює власний сертифікат для веб-сайту, він не буде підписаний ЦС, якому довіряє ваш комп’ютер, і тому ви побачите попередження.
Що зробив HPKP?
Вся система сертифікатів покладається на надійність центрів сертифікації. Спочатку, однак, не було жодних засобів захисту від скомпрометації ЦС хакерами або шахрайства та вибору неправильної видачі сертифікатів.
HPKP був розроблений для захисту від такої можливості. Це дозволяє веб-сайтам вказувати ексклюзивний список сертифікатів, яким можна довіряти для веб-сайту в процесі, який називається закріпленням. Можна було закріпити кореневий або проміжний сертифікат, що по суті дозволило одному ЦС видавати сертифікати для веб-сайту. Також можна було закріпити сертифікат самого веб-сайту, не даючи навіть правильному ЦС видати інший дійсний сертифікат.
Технічно закріплений не сам сертифікат, а хеш ключа сертифіката. Хеш - це одностороння криптографічна функція. Це означає, що можна перевірити, що сертифікат, представлений веб-переглядачу веб-сайтом, відповідає закріпленому сертифікату, але неможливо використовувати хеш для створення дійсного сертифіката.
Для HPKP потрібно було закріпити принаймні два ключі, принаймні один з яких має бути резервним, а не в поточному ланцюжку сертифікатів. Ця резервна копія дозволяє налаштувати плавний перехід на новий сертифікат, який не заважає користувачам підключатися.
Якщо сертифікат HTTPS, представлений веб-переглядачу, не відповідає одному із закріплених сертифікати, то браузер зобов’язаний відхилити його та не допустити, щоб користувач не міг обійти сертифікат повідомлення про помилку.
Структура HPKP
Заголовок HPKP складається з трьох обов'язкових частин і двох необов'язкових. Заголовок повинен мати назву «Public-Key-Pins», наступні два або більше сертифікати повинні мати хеш SHA256, закодований base64, закріплений у форматі «pin-sha256=»
Порада: SHA256 — це алгоритм хешування, який використовується HPKP. Base64 — це набір символів із 64 символів: 0-9, a-z, A-Z і спеціальні символи «+» і «/». Знак «=» використовується для додавання до двох останніх символів, якщо потрібно.
Додатковими параметрами є «includeSubDomains» і «report-uri». «includeSubDomains наказує браузеру застосувати захист HPKP до будь-якого субдомену поточного веб-сайту на час таймера «максимальний вік». «report-uri» — це функція, яка дозволяє вказати веб-сайт, куди можна надсилати звіти про помилки, і призначена для виявлення та вирішення проблем.
Існує другий варіант заголовка під назвою «Public-Key-Pins-Report-Only». Проте все те саме, якщо виявлено помилку, не виконується жодних дій, окрім повернення повідомлення про помилку до браузера та до «report-uri», якщо таке налаштовано. Варіант лише звіту був розроблений для повномасштабного тестування заголовка перед розгортанням, де помилки не викликають проблем у користувачів.
Проблеми з HPKP
HPKP було застаріло з двох основних причин. Існували два способи, за допомогою яких заголовок міг викликати серйозні проблеми для веб-сайту, який його використовує, вони називалися HPKP Suicide та Ransom PKP.
HPKP Suicide — це проблема, коли законні власники веб-сайту втрачають доступ до всіх закріплених ключів. Це може статися через випадкове видалення, злом, віруси, пошкодження даних або з багатьох інших причин. Через складність правильної реалізації HPKP і, особливо, його оновлення під час ротації сертифікатів, відносно легко зробити помилку конфігурації. Проте з HPKP, якщо ви помилитеся, усі недавні відвідувачі вашого веб-сайту не зможуть отримати доступ до вашого веб-сайту протягом тривалості таймера «максимального віку». Сайт smashingmagazine.com опублікував статті детально розповісти про свій досвід саме з цією проблемою, яка, по суті, відключила сайт для більшості відвідувачів на чотири дні, перш ніж було розгорнуто виправлення.
Ransom PKP — це теоретична атака, коли хакер отримує доступ до веб-сервера, потім краде всі довірені сертифікати та ключі, а потім вимагає викуп за їх повернення. У звичайному налаштуванні ви можете просто згенерувати нові ключі та сертифікати та створити резервну роботу веб-сайту менш ніж за годину. Однак, якщо увімкнено HPKP, ці ключі закріплені, якщо ви не можете надати користувачам закріплений сертифікат, вони не зможуть отримати доступ до веб-сайту протягом таймера «максимального віку». Залежно від конфігурації та наявності резервних копій цю проблему може бути неможливо вирішити.
З обома цими проблемами нові користувачі зможуть отримати доступ до веб-сайту, як і вони ніколи не бачив старий заголовок HPKP, який наказував їхньому браузеру довіряти лише тому, якого зараз немає сертифікати. Проте всім недавнім відвідувачам, таким як постійні клієнти та читачі, доведеться чекати весь час таймера «максимального віку».
Враховуючи серйозність цих проблем, а також складність конфігурації та обслуговування, використання заголовка HPKP було дуже низьким. Зрештою, основні браузери погодилися повністю відмовитися від його підтримки, і через пару років заголовок HPKP був повсюдно застарілим.