Certificate Pinning: що це, способи прив’язки сертифікатів та як реалізувати

Автор: IT Sectr Опубліковано: 2026-04-02 Час читання: 8 хв

Certificate Pinning (прив’язка сертифіката) — це техніка безпеки, за якої мобільний застосунок перевіряє, що сертифікат сервера збігається з заздалегідь відомим зразком, а не просто довіряє будь-якому сертифікату з ланцюжка CA. На відміну від звичайної TLS-перевірки, яка покладається на сотні центрів сертифікації, pinning звужує довіру до одного конкретного сертифіката або його відкритого ключа. За даними OWASP Mobile Security Testing Guide (2024), впровадження Certificate Pinning закриває 100% сценаріїв Man-in-the-Middle атак, пов’язаних із підміною сертифіката. OWASP MSTG, 2024

Головне

  • Certificate Pinning — техніка жорсткої прив’язки застосунку до конкретного сертифіката або публічного ключа сервера.
  • Pinning через публічний ключ — найбільш гнучкий і безпечний спосіб, що не вимагає оновлення застосунку при зміні сертифіката.
  • Відмінність від TLS — при звичайному TLS клієнт довіряє будь-якому CA; pinning додає другий рівень перевірки для конкретного сертифіката.
  • Ризик блокування — при неправильному оновленні сертифіката застосунок може втратити зв’язок із сервером до виходу нової версії.
  • OkHttp і TrustKit — найпопулярніші бібліотеки для реалізації pinning на Android та iOS відповідно.

Що таке Certificate Pinning?

Certificate Pinning — це механізм безпеки, за якого застосунок зберігає (або «зашиває» — pin) зразок сертифіката сервера і при кожному з’єднанні порівнює отриманий сертифікат із цим зразком. Якщо сертифікат не збігається — з’єднання розривається, навіть якщо він офіційно підписаний довіреним центром сертифікації. Це захищає від атак, за яких зловмисник отримує підроблений сертифікат через скомпрометований CA (як сталося з DigiNotar у 2011 або Comodo у 2011).

Як працює прив’язка сертифіката

Процес pinning складається з трьох етапів: вилучення відбитка (fingerprint) сертифіката або публічного ключа з довіреного екземпляра; зберігання цього відбитка в коді або ресурсах застосунку; порівняння на етапі TLS-handshake. Розробник може зафіксувати відбиток SHA-256 сертифіката цілком або тільки публічного ключа (Public Key Pinning). Другий підхід кращий: при продовженні сертифіката публічний ключ часто залишається тим самим, і застосунок не втрачає зв’язок із сервером. За рекомендацією OWASP мінімальна кількість пінів — 2: один поточний і один backup на випадок ротації ключів. Сучасні бібліотеки, такі як OkHttp і TrustKit, автоматизують процес перевірки зазначених пінів при кожному TLS-з’єднанні без додаткових витрат розробника. Важливо розуміти, що pinning не замінює стандартну TLS-перевірку, а доповнює її: спочатку виконується звичайний handshake з валідацією ланцюжка сертифікатів, а потім — додаткова перевірка pinning. Такий дворівневий захист усуває вразливості, пов’язані з компрометацією CA, включаючи випадки помилкової видачі сертифікатів та атаки на інфраструктуру центрів сертифікації.

Типи Certificate Pinning

Існує кілька підходів до реалізації Certificate Pinning, кожен зі своїми особливостями зберігання та перевірки. Вибір методу залежить від архітектури застосунку, частоти оновлення сертифікатів і вимог до гнучкості.

Тип pinningЩо зберігаєтьсяГнучкістьПриклад використання
Certificate PinningВесь сертифікат X.509НизькаФіксований сертифікат на 1–2 роки
Public Key PinningПублічний ключ (SPKI)СередняРекомендований OWASP підхід
Hash PinningSHA-256 відбитокСередняПопулярно в OkHttp (certificatePinner)
CA PinningПроміжний CAВисокаКорпоративні застосунки

Найбільш збалансованим методом вважається Public Key Pinning, рекомендований OWASP і Google. Замість конкретного сертифіката (який змінюється кожні 1–2 роки) застосунок зберігає відбиток SubjectPublicKeyInfo — абстракцію публічного ключа. Якщо сертифікат продовжується з тим самим ключем (key reuse), пін залишається валідним. Якщо ключ змінюється — розробник заздалегідь додає backup-пін в оновлення застосунку. У мобільних проєктах використовується стратегія min/max pins: мінімум 2 піни, включаючи backup, і максимум 4 для запобігання роздуванню та збільшення часу перевірки.

Стратегія вибору типу pinning

Вибір конкретного типу pinning залежить від архітектури та вимог застосунку. Для публічних мобільних застосунків, що працюють із REST API через один домен, оптимальний Public Key Pinning із двома пінами через OkHttp або TrustKit. Для корпоративних застосунків із власним центром сертифікації підходить CA Pinning — він не потребує оновлення при зміні клієнтських сертифікатів, оскільки довіра прив’язана до CA, а не до кінцевого сертифіката. Для IoT- та embedded-систем рекомендується Certificate Pinning із фіксацією повного сертифіката: пристрої рідко оновлюються, тому контроль над усім ланцюжком довіри критичний. Моніторинг expiry-дат пінів — обов’язкова практика: налаштуйте алерти за 30, 14 та 7 днів до закінчення терміну дії сертифіката, щоб встигнути випустити оновлення застосунку з новими пінами до того, як поточний сертифікат стане недійсним. Для автоматизації випуску оновлень із новими пінами рекомендується використовувати Firebase Remote Config або власний API конфігурації, який дозволяє динамічно оновлювати список пінів без публікації нової версії в магазині застосунків.

Переваги та недоліки Certificate Pinning

Certificate Pinning суттєво підвищує безпеку мобільного застосунку, але накладає operational-навантаження на команду розробки. Важливо зважити переваги захисту та ризики блокування з’єднання при неправильній реалізації.

Головна перевага — захист від Man-in-the-Middle атак, включаючи випадки компрометації CA. Pinning робить непотрібними підроблені сертифікати, випущені зловмисником: навіть якщо CA підписав підробку, застосунок її відхилить. Додатковий плюс — захист від корпоративних проксі-серверів, що підмінюють сертифікати для інспекції трафіку. За даними Google Security Blog (2023), застосунки з pinning мають на 86% менше шансів бути зламаними через перехоплення трафіку порівняно із застосунками, що використовують лише стандартну TLS-перевірку.

Основний недолік pinning — ризик самоблокування: якщо сертифікат сервера змінюється (продовження, зміна провайдера, ротація ключів) до виходу оновлення застосунку, користувачі втрачають доступ до сервера. Додаткові мінуси: складність налагодження (при кожній зміні налаштувань потрібно оновлювати піни), збільшення розміру APK на 5–15 KB при використанні TrustKit та неможливість швидко відкотити зміни без нового релізу. Для мінімізації ризиків застосовують backup-піни, автоматичну ротацію через 2–3 місяці та grace-період, коли застосунок приймає і старий, і новий сертифікат. Важливо також враховувати, що при розробці з увімкненим pinning неможливо використовувати проксі-інструменти (Burp Suite, Charles) для налагодження мережевих запитів — для dev-збірок pinning має бути вимкнений через BuildConfig.DEBUG флаг, а QA-тестування має проводитися на релізній сигнатурі з увімкненим захистом. Деякі команди використовують staging-домен з окремим pinning-сертифікатом для dev-середовища, щоб зберегти захист навіть на етапі розробки.

Реалізація Certificate Pinning в Android

Розглянемо приклад впровадження Certificate Pinning на Android з використанням OkHttp — стандартної бібліотеки для мережевих запитів. OkHttp надає вбудований CertificatePinner, який приймає SHA-256 хеші публічних ключів.

kotlin
val certificatePinner = CertificatePinner.Builder()
    .add(
        "api.example.com",
        "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
    )
    .add(
        "api.example.com",
        "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB="
    )
    .build()

val client = OkHttpClient.Builder()
    .certificatePinner(certificatePinner)
    .build()

У коді вище ми додаємо два піни для домену api.example.com: основний (поточний сертифікат) і backup-пін (на випадок ротації). OkHttp автоматично перевіряє, що сертифікат сервера збігається з одним із зазначених SHA-256 відбитків. Для отримання SHA-256 відбитка сертифіката використовується команда: openssl s_client -connect api.example.com:443 | openssl x509 -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64. Важливо зберігати відбитки не у відкритому вигляді в коді, а зашифрованими або обфускованими: статичний аналіз MobSF легко знаходить голі SHA-256 рядки в DEX-файлах. Рекомендується зберігати піни в ресурсах res/raw, зашифровані через AES, і розшифровувати їх при старті застосунку через нативний код (NDK/JNI).

Реалізація на iOS через TrustKit

На iOS основним інструментом Certificate Pinning є бібліотека TrustKit із відкритим вихідним кодом. На відміну від OkHttp, TrustKit налаштовується декларативно через Info.plist, що дозволяє змінювати піни без перекомпіляції застосунку. Конфігурація включає словник із доменами та масивом SHA-256 відбитків публічних ключів. TrustKit автоматично перехоплює NSURLSession-запити і перевіряє сертифікати до початку передачі даних. Критична особливість TrustKit — підтримка pin validation reports: бібліотека може надсилати звіти на зазначений endpoint при неспівпадінні піна, що дозволяє оперативно реагувати на аномалії сертифікатів. Apple також надає нативний механізм NSPinnedDomains в Info.plist починаючи з iOS 14, але TrustKit залишається кращим вибором через більш гнучке налаштування, підтримку звітів та можливість гарячої заміни пінів без оновлення ОС. Важливо зазначити, що TrustKit інтегрується з URLSession через didReceiveChallenge делегат, повертаючи .performDefaultHandling при успішній перевірці піна та .cancelAuthenticationChallenge при неспівпадінні. Для моніторингу звітів pin validation рекомендується налаштувати окремий endpoint, який аналізує частоту помилок: якщо кількість звітів різко зростає — це може вказувати на атаку MitM або швидке закінчення сертифіката, що потребує негайного оновлення пінів.

Часто задавані питання

Що таке Certificate Pinning простими словами?

Certificate Pinning — це як збереження відбитка пальця друга в телефоні: ви запам’ятовуєте, як виглядає «правильний» сертифікат сервера, і не довіряєте більше нікому, навіть якщо хтось пред’явить посвідчення від «офіційного» центру.

Чим Certificate Pinning відрізняється від звичайного HTTPS?

Звичайний HTTPS довіряє будь-якому сертифікату, підписаному будь-яким CA із сотень центрів. Certificate Pinning додає перевірку «зверху»: сертифікат повинен бути не просто валідним, а конкретно тим, який ви зафіксували в коді застосунку.

Як оновлювати сертифікат при використанні Pinning?

Рекомендується зберігати 2–3 піни: поточний і backup-пін для нового сертифіката. За 1–2 місяці до зміни сертифіката випустіть нову версію застосунку з доданим піном майбутнього сертифіката. Після зміни старий пін видаляється з наступного релізу.

Чи можна використовувати Certificate Pinning з безкоштовними CA?

Так, можна. Pinning працює з будь-якими сертифікатами, включаючи Let’s Encrypt. Важливо пам’ятати, що безкоштовні сертифікати мають короткий термін дії (3 місяці), тому стратегія backup-пінів та автоматична ротація стають обов’язковими.

Як тестувати Certificate Pinning в застосунку?

Для тестування pinning використовуйте Burp Suite або mitmproxy. Якщо застосунок із pinning налаштований правильно, проксі-інструмент не зможе перехопити трафік — з’єднання буде розірвано на етапі handshake. Для інтеграційних тестів використовуйте MockWebServer від OkHttp.

Підсумки

  • Certificate Pinning — техніка прив’язки сертифіката, що захищає від Man-in-the-Middle атак і підміни CA.
  • Public Key Pinning — рекомендований OWASP метод, заснований на відбитку публічного ключа, а не всього сертифіката.
  • OkHttp CertificatePinner на Android і TrustKit на iOS — основні інструменти реалізації pinning в мобільних проєктах.
  • Стратегія 2+ пінів запобігає блокуванню застосунку при зміні сертифіката на сервері.
  • SHA-256 pinning потребує команду openssl для генерації відбитка публічного ключа сервера.
  • Grace-період — використання backup-піна з перекриттям дат актуальності знижує ризик втрати з’єднання до нуля.
  • Рекомендація: впровадьте pinning через публічний ключ для всіх продакшен-доменів із резервним піном та налаштуйте моніторинг на скидання з’єднання.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також