Назад к вопросам
МТС
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-атак.