← Назад к вопросам

Что такое SSL Pinning?

2.0 Middle🔥 171 комментариев
#Работа с сетью

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое SSL Pinning?

SSL Pinning (или Certificate Pinning) — это механизм безопасности, применяемый в клиентских приложениях (особенно мобильных), который позволяет зафиксировать ("прикрепить") конкретный цифровой сертификат или его ключевые компоненты для определённого сервера. Вместо того чтобы доверять всей цепочке сертификатов, предоставленной операционной системой или браузером, приложение заранее "знает" ожидаемый сертификат и проверяет соответствие во время TLS/SSL-сессии. Это предотвращает атаки типа Man-in-the-Middle (MitM), где злоумышленник может подставить свой сертификат, если ему удалось получить доверенный корневой сертификат в системе устройства.

Почему это важно?

В стандартной схеме TLS/SSL проверки, клиент (например, ваше iOS-приложение) проверяет сертификат сервера по цепочке доверия до корневого сертификата, который считается доверенным в системе (например, хранится в iOS Trust Store). Однако, если устройство подверглось атаке (например, через вредоносное ПО или инженерный доступ) и злоумышленник добавил свой корневой сертификат, он может выпускать поддельные сертификаты для любого домена, и система признает их легальными. SSL Pinning обходит эту зависимость от системного хранилища, обеспечивая дополнительный уровень контроля.

Как реализуется на iOS?

На iOS реализация обычно предполагает два основных подхода:

  1. Pinning по сертификату: В приложение включается точная копия ожидаемого сертификата (или его публичного ключа) в виде ресурса. Во время соединения приложение сравнивает полученный сертификат сервера с встроенным.

  2. Pinning по публичному ключу: Вместо всего сертификата, хранится только его публичный ключ (например, в формате SubjectPublicKeyInfo). Это более гибкий подход, так как позволяет сертификату обновляться (например, после истечения срока действия), если публичный ключ остаётся неизменным.

Пример базовой реализации через URLSessionDelegate (pinning по сертификату):

import Foundation

class SSLPinningDelegate: NSObject, URLSessionDelegate {
    let pinnedCertificateData: Data
    
    init(pinnedCertificateData: Data) {
        self.pinnedCertificateData = pinnedCertificateData
    }
    
    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
        }
        
        // Получаем сертификат сервера
        let serverCertificate = SecTrustGetCertificateAtIndex(serverTrust, 0)
        let serverCertificateData = SecCertificateCopyData(serverCertificate) as Data
        
        // Сравниваем с прикреплённым сертификатом
        if serverCertificateData == pinnedCertificateData {
            completionHandler(.useCredential, URLCredential(trust: serverTrust))
        } else {
            completionHandler(.cancelAuthenticationChallenge, nil)
        }
    }
}

Плюсы и минусы

Преимущества:

  • Усиленная защита: Защищает от атак MitM, даже если доверенные сертификаты в системе скомпрометированы.
  • Контроль над доверием: Разработчик определяет, какой сертификат или ключ считается доверенным, без зависимости от внешних факторов.

Недостатки и сложности:

  • Административная нагрузка: При обновлении сертификата на сервере необходимо выпускать новую версию приложения с новым прикреплённым сертификатом/ключом.
  • Проблемы с обновлением: Если сертификат внезапно меняется (например, из-за сбоя или аварийного обновления), приложение с pinning перестаёт работать до выпуска апдейта.
  • Ограничения для динамических сред: В сложных инфраструктурах с множеством серверов, балансировкой нагрузки или CDN, где сертификаты могут различаться, реализация pinning требует более сложной логики (например, pinning к нескольким допустимым ключам).

Практические рекомендации

Для баланса между безопасностью и гибкостью часто применяют следующие стратегии:

  • Использовать pinning по публичному ключу, который может оставаться постоянным при перевыпуске сертификата.
  • Реализовать отказоустойчивость: например, сначала пытаться соединиться с pinning, но если он неуспешен (по причинам, не связанным с MitM), делать безопасный fallback на стандартную проверку, сопровождая это логированием для дальнейшего анализа.
  • Включать резервные (backup) ключи на случай плановой замены инфраструктуры.
  • Не использовать pinning для доменов третьих сторон (например, для изображений или аналитики), где сертификаты могут меняться непредсказуемо.

В современных iOS-приложениях SSL Pinning — важный инструмент для приложений, обрабатывающих конфиденциальные данные (банкинг, медицинские данные, корпоративные коммуникации). Однако его внедрение должно быть тщательно продумано с учётом жизненного цикла сертификатов и стратегии обновления приложения.