> Что такое 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:
SWIFTclass 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 - это нормально, но важно понимать ограничения.
> Похожие задачи по mobile
В чем разница между git rebase и merge
Что происходит в методах viewDidLoad и viewWillAppear при добавлении view в иерархию
Что объединяет структуры данных Dictionary и Set в Swift
В чем разница между open и public в Swift
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью