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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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