Что делать при истечении срока действия SSL-сертификата на сервере?

«Что делать при истечении срока действия SSL-сертификата на сервере?» — вопрос из категории Сети, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основное решение — обновить сертификат на сервере. После этого клиентские приложения заработают без изменений.

Временные решения (только для тестирования):

  1. Отключить проверку сертификата в коде (iOS):

    class UnsafeCertificateDelegate: NSObject, URLSessionDelegate {
        func urlSession(_ session: URLSession,
                       didReceive challenge: URLAuthenticationChallenge,
                       completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
            if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
                // Опасность: принимаем любой сертификат
                let credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
                completionHandler(.useCredential, credential)
            }
        }
    }
    // Использование
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config,
                            delegate: UnsafeCertificateDelegate(),
                            delegateQueue: nil)
  2. Добавить исключение ATS в Info.plist:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>example.com</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>

Важно: Эти методы нельзя использовать в production. Они обходят защиту, делая соединение уязвимым для атак "человек посередине" (MITM). В продакшене всегда используйте валидные сертификаты от доверенных центров сертификации (CA).