> Что такое SSL pinning, зачем он нужен и как работает? (iOS, Swift, Android)

Уровень: junior · Роль: mobile · Категория: Технические вопросы

Компании: Иннотех

Стек: iOS, Swift, Android

> Пример ответа

Короткий ответ

SSL pinning - это механизм защиты от man-in-the-middle-атак, при котором приложение "привязывается" к конкретному сертификату или публичному ключу сервера, а не доверяет всей цепочке системных CA. Нужен, чтобы злоумышленник не мог подменить сертификат через перехват трафика (например, через прокси или вредоносный CA). Работает так: при первом соединении приложение сравнивает сертификат сервера с заранее зашитым в билд эталоном. Если не совпадает - соединение обрывается.

Подробное объяснение

Обычно HTTPS-соединение проверяет сертификат сервера через цепочку доверия к системным certificate authority (CA). Это удобно, но есть уязвимость: если на устройстве пользователя установлен корпоративный или вредоносный CA, злоумышленник может выпустить сертификат для любого домена и перехватить трафик.

SSL pinning решает эту проблему тем, что приложение хранит ожидаемый сертификат или его публичный ключ. Есть два основных подхода:

  • Certificate pinning - хранится полный сертификат (или его хеш). Самый строгий вариант: любое изменение сертификата на сервере ломает приложение.
  • Public key pinning - хранится только публичный ключ. Более гибкий: сертификат можно перевыпустить, но ключ остаётся тем же.

На практике pinning обычно применяется не ко всей цепочке, а к конкретному сертификату сервера или промежуточному CA. Это снижает риск поломки при ротации сертификатов.

Важный нюанс: pinning не защищает от компрометации самого устройства или от reverse engineering. Его цель - только против MITM через подмену сертификата.

На практике

Для junior-позиции важно понимать, где pinning применяется:

  • В мобильных банках и платёжных приложениях.
  • В приложениях с чувствительными данными (медицина, корпоративные системы).
  • В API-клиентах, где критична аутентичность сервера.

Типичный сценарий на собеседовании: интервьюер спрашивает, почему нельзя просто использовать стандартный HTTPS. Ответ - стандартный HTTPS доверяет любому CA из системного хранилища, а pinning сужает доверие до конкретного сертификата.

Также стоит упомянуть trade-off: pinning усложняет ротацию сертификатов и требует механизма обновления "зашитых" данных (например, через удалённую конфигурацию или несколько запасных ключей).

Пример кода

Для iOS (Swift) с использованием URLSession:

SWIFT
class PinningDelegate: NSObject, URLSessionDelegate {
func urlSession(_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,
let serverTrust = challenge.protectionSpace.serverTrust else {
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
// Получаем сертификат сервера
if let serverCertificate = SecTrustGetCertificateAtIndex(serverTrust, 0) {
let serverCertData = SecCertificateCopyData(serverCertificate) as Data
// Сравниваем с зашитым сертификатом
if let pinnedCertData = PinnedCertificate.data,
serverCertData == pinnedCertData {
completionHandler(.useCredential, URLCredential(trust: serverTrust))
} else {
completionHandler(.cancelAuthenticationChallenge, nil)
}
} else {
completionHandler(.cancelAuthenticationChallenge, nil)
}
}
}

Для Android (Kotlin) с OkHttp:

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

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

Как отвечать на собеседовании

Начни с определения: "SSL pinning - это механизм, который заставляет приложение проверять сертификат сервера не через системные CA, а через заранее сохранённый эталон". Затем объясни зачем: "защита от MITM, когда злоумышленник подменяет сертификат". После этого опиши механизм: "приложение хранит хеш сертификата или публичного ключа и сравнивает его при handshake". Упомяни два подхода: certificate pinning и public key pinning. В конце скажи про ограничения: "не защищает от компрометации устройства, требует механизма обновления".

Что проверяет интервьюер

  • Понимание базовой модели HTTPS и роли CA.
  • Знание угрозы MITM и почему стандартной проверки недостаточно.
  • Умение различать certificate pinning и public key pinning.
  • Понимание trade-off: сложность ротации сертификатов.
  • Осведомлённость о том, что pinning не решает все проблемы безопасности.

Типичные ошибки

  • Путать SSL pinning с обычной проверкой сертификата - это разные вещи.
  • Говорить, что pinning защищает от взлома устройства или от reverse engineering.
  • Не упоминать проблему ротации сертификатов.
  • Предлагать хранить сертификат в UserDefaults или в открытом виде - это снижает смысл pinning.
  • Не знать, что pinning можно обойти через jailbreak/root и инструменты типа Frida - это нормально, но важно понимать ограничения.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью