SSL pinning — це коли застосунок довіряє не будь-якому дійсному сертифікату від будь-якого засвідчувального центру, а заздалегідь заданому сертифікату або відкритому ключу сервера, зашитому прямо в код.
Навіщо потрібен пінінг
Пінінг захищає від ситуації, коли з'єднання підтверджує сертифікат, якому формально можна довіряти, але він виданий не для справжнього сервера: підставний засвідчувальний центр, перехоплення трафіку на рівні корпоративної мережі або скомпрометований центр сертифікації, що виписав чужий сертифікат на потрібне ім'я.
Від чого пінінг не захищає: від злому самого сервера, від вразливості в коді застосунку і від витоку даних після того, як зашифроване з'єднання вже встановлено. Він перевіряє лише те, з ким саме встановлено з'єднання, а не що відбувається далі.
Як зазвичай працює довіра без пінінгу
Без пінінгу застосунок перевіряє лише одне: чи підписаний сертифікат сервера одним із центрів, яким довіряє операційна система. Будь-який із сотень таких центрів формально рівноправний. Застосунку байдуже, який саме центр видав сертифікат, аби ланцюжок підписів сходився до довіреного кореня.
Що саме прикріплюють
Прикріпити можна різні частини сертифіката, і від вибору залежить, наскільки часто доведеться оновлювати застосунок.
| Що прикріплюють | Наскільки крихко при продовженні сертифіката |
|---|---|
| Сертифікат цілком | Найкрихкіший варіант: змінюється при кожному продовженні, навіть якщо ключ лишився тим самим |
| Відкритий ключ | Переживає продовження, якщо ключ не змінювався, ламається лише при зміні самого ключа |
| Проміжний центр | Найстійкіший, але захищає слабше — довіра зміщується на весь центр цілком |
Головна небезпека
При плановій зміні сертифіката на сервері застосунок із застарілим пінінгом перестає з'єднуватися з сервером у всіх користувачів одночасно — причому станеться це не поступово, а одразу після перемикання сертифіката. Полагодити це можна лише оновленням самого застосунку, а оновлення доходить до користувачів не миттєво і не до всіх.
Саме ця особливість — головна причина, через яку пінінг часто знімають після першого ж болісного інциденту зі зміною сертифіката.
Що роблять замість і разом з пінінгом
Декілька практик знижують ризик, не відмовляючись від ідеї повністю.
Запасний прикріплений ключ, доданий заздалегідь, дає змогу замінити робочий сертифікат без оновлення застосунку — довіра лишається, бо один із прикріплених варіантів продовжує збігатися. Строк придатності самого пінінгу обмежують у часі, щоб застаріла прив'язка не лишилася в застосунку назавжди. На боці домену схожий за духом захист дає CAA-запис: він обмежує, які засвідчувальні центри взагалі мають право видавати сертифікат для домену — детальніше у статті CAA-запис DNS.
Коли пінінг доречний, а коли шкідливий
Рішення залежить від того, хто керує оновленням клієнта і наскільки швидко оновлення доходять до користувачів.
| Тип застосунку | Наскільки доречний пінінг |
|---|---|
| Мобільний застосунок банку чи платіжного сервісу | Доречний за налагодженим запасним ключем і контролем оновлень |
| Масовий споживчий застосунок з рідкісними оновленнями | Ризикований: масовий збій у всіх користувачів одразу |
| Внутрішній клієнт, що сам з'єднується з власним сервером | Зручний — обидві сторони контролюються однією командою |
| Звичайний сайт, що відкривають у браузері | Не застосовується: браузер не підтримує пінінг під керуванням сайту |
Часті питання
Що таке SSL pinning простими словами?
Це спосіб, за якого застосунок довіряє не будь-якому дійсному сертифікату, а конкретному сертифікату чи ключу сервера, заздалегідь зашитому в код. Навіть формально правильний сертифікат з іншого джерела такий застосунок прийме лише тоді, коли він збігається з прикріпленим зразком.
Чи потрібен пінінг звичайному сайту?
Ні, браузери не надають сайтам можливості задавати свій пінінг, і звичайний сайт покладається на стандартну перевірку сертифіката операційною системою. Пінінг застосовують у власних мобільних застосунках і API-клієнтах, де розробник керує і клієнтом, і сервером.
Що станеться при продовженні сертифіката?
Якщо застосунок прикріпив сертифікат цілком або ключ, а продовження змінило саме прикріплену частину, застосунок перестане з'єднуватися з сервером у всіх користувачів одразу. Уникнути цього допомагає заздалегідь доданий запасний прикріплений ключ, який переживе продовження.
Чим пінінг відрізняється від HSTS?
HSTS змушує браузер звертатися до сайту лише захищеним з'єднанням і не приймати спроби знизити його до звичайного HTTP. Пінінг — про довіру до конкретного сертифіката чи ключа всередині вже захищеного з'єднання, і застосовується зазвичай не в браузері, а в окремому застосунку.
Висновок
Пінінг варто додавати усвідомлено і разом із запасним ключем, а не за умовчанням: ціна помилки — повна зупинка застосунку у всіх користувачів одразу. Які типи сертифікатів взагалі існують — у статті типи SSL-сертифікатів.