Sobes.tech
Назад к вопросам
Junior — Middle
78

Могли бы вы объяснить, что означает принцип SSL Pinning и как он реализуется в приложениях?

Компании, где спрашивали
МТСМТС
Травелата

Ответ от нейросети

sobes.tech AI

SSL Pinning — это техника безопасности, которая позволяет приложению проверять, что оно соединяется именно с тем сервером, которому доверяет, а не с подставным. Обычно при установлении HTTPS-соединения клиент проверяет сертификат сервера через цепочку доверия, но злоумышленник может попытаться подменить сертификат (например, через MITM-атаку).

Суть SSL Pinning в том, что приложение хранит «запиненный» сертификат или публичный ключ сервера и при соединении сверяет его с тем, что пришло. Если не совпадает — соединение разрывается.

В iOS это реализуется, например, через URLSessionDelegate и метод:

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    if let serverTrust = challenge.protectionSpace.serverTrust {
        // Получаем сертификат сервера
        let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0)
        // Извлекаем данные сертификата
        let remoteCertificateData = SecCertificateCopyData(certificate!) as Data
        
        // Загружаем локальный сертификат из бандла
        if let localCertPath = Bundle.main.path(forResource: "myserver", ofType: "cer"),
           let localCertData = try? Data(contentsOf: URL(fileURLWithPath: localCertPath)) {
            
            if remoteCertificateData == localCertData {
                // Сертификаты совпадают — доверяем
                let credential = URLCredential(trust: serverTrust)
                completionHandler(.useCredential, credential)
                return
            }
        }
    }
    // Иначе — отклоняем соединение
    completionHandler(.cancelAuthenticationChallenge, nil)
}

Таким образом, приложение защищается от подмены сертификата и MITM-атак.