Certificate pinning — это техника безопасности, которая проверяет SSL-сертификат сервера по известному, доверенному сертификату, встроенному прямо в твоё приложение. Это гарантирует, что твоё приложение общается только с нужным сервером, даже если поддельный Центр сертификации выдаст поддельный, но технически валидный сертификат.
Certificate pinning реализуется через URLSessionDelegate и его метод для обработки запросов аутентификации:
func urlSession(
_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void
) {
guard
let serverTrust = challenge.protectionSpace.serverTrust,
let serverCert = SecTrustGetCertificateAtIndex(serverTrust, 0),
let pinnedCert = loadPinnedCertificate()
else {
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
let serverCertData = SecCertificateCopyData(serverCert) as Data
let pinnedCertData = SecCertificateCopyData(pinnedCert) as Data
if serverCertData == pinnedCertData {
completionHandler(.useCredential, URLCredential(trust: serverTrust))
} else {
completionHandler(.cancelAuthenticationChallenge, nil)
}
}
.cer) прямо в свой app target.cancelAuthenticationChallengeCertificate pinning проверяет SSL-сертификат сервера против известного доверенного сертификата, встроенного прямо в приложение, предотвращая MITM-атаки даже если какой-то рогулиный Certificate Authority выдаст технически валидный сертификат.
Новый — ещё не проверен сообществом
Вы