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

Что делать когда у сертификата истек срок действия?

1.3 Junior🔥 91 комментариев
#Soft Skills и карьера

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

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

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

Решение проблемы с истёкшим SSL-сертификатом в iOS-приложениях

Когда у SSL-сертификата истекает срок действия, это создаёт критическую проблему для iOS-приложений, так как система безопасности Apple (App Transport Security) по умолчанию блокирует сетевые запросы к серверам с невалидными сертификатами. Решение зависит от того, кто является владельцем сертификата и где возникла проблема.

Если сертификат на вашем собственном сервере

Немедленные действия для администратора сервера:

  1. Обновление сертификата у вашего SSL-провайдера (Let's Encrypt, Comodo, DigiCert и др.)
  2. Установка нового сертификата на все серверы (включая балансировщики нагрузки и CDN)
  3. Проверка цепочки доверия с помощью инструментов типа openssl или онлайн-валидаторов
  4. Обновление промежуточных сертификатов при необходимости

Временные решения на стороне клиента (iOS-приложения)

ВАЖНО: Эти решения должны использоваться только как временная мера, пока серверная сторона не обновит сертификат, либо для тестирования.

1. Настройка ATS исключений (осторожно!)

В Info.plist можно добавить исключения для конкретного домена:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>yourdomain.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>

Недостатки: снижение безопасности, требует обновления приложения через App Store.

2. Использование делегата URLSession для валидации сертификата

Более контролируемый подход через URLSessionDelegate:

class NetworkManager: NSObject, URLSessionDelegate {
    var allowExpiredCertificates = false // Временный флаг
    
    func urlSession(_ session: URLSession,
                    didReceive challenge: URLAuthenticationChallenge,
                    completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        
        guard let serverTrust = challenge.protectionSpace.serverTrust else {
            completionHandler(.cancelAuthenticationChallenge, nil)
            return
        }
        
        if allowExpiredCertificates {
            // ВРЕМЕННО разрешаем истёкшие сертификаты
            let credential = URLCredential(trust: serverTrust)
            completionHandler(.useCredential, credential)
        } else {
            // Стандартная валидация
            let policy = SecPolicyCreateSSL(true, challenge.protectionSpace.host as CFString)
            SecTrustSetPolicies(serverTrust, policy)
            
            var error: CFError?
            let isTrusted = SecTrustEvaluateWithError(serverTrust, &error)
            
            if isTrusted {
                let credential = URLCredential(trust: serverTrust)
                completionHandler(.useCredential, credential)
            } else {
                completionHandler(.cancelAuthenticationChallenge, nil)
            }
        }
    }
}

3. Pin-валидация сертификата (с обновлением)

Для приложений, использующих pinning сертификатов, нужно:

class CertificatePinner {
    static func validateCertificate(_ serverTrust: SecTrust, 
                                   pinnedCertificates: [Data]) -> Bool {
        
        // Проверяем цепочку сертификатов
        let certificateCount = SecTrustGetCertificateCount(serverTrust)
        
        for index in 0..<certificateCount {
            guard let certificate = SecTrustGetCertificateAtIndex(serverTrust, index) else {
                continue
            }
            
            let data = SecCertificateCopyData(certificate) as Data
            
            // Сравниваем с закреплёнными сертификатами
            if pinnedCertificates.contains(data) {
                return true
            }
        }
        
        return false
    }
}

Долгосрочные стратегии предотвращения проблем

  1. Мониторинг сроков действия сертификатов

    • Настройка автоматических уведомлений за 30, 14 и 7 дней до истечения
    • Использование сервисов мониторинга (CertExpiry, UptimeRobot)
  2. Автоматическое обновление сертификатов

    • Настройка авто-обновления через Let's Encrypt и Certbot
    • Использование контейнеров с автоматическим rotation сертификатов
  3. Стратегия pinning с механизмом обновления

    class CertificateManager {
        static var pinnedCertificates: [Data] {
            // Загрузка из безопасного источника с возможностью обновления
            // например, с вашего CDN с проверенной подписью
        }
        
        static func updatePinnedCertificates(from url: URL, 
                                            completion: @escaping (Bool) -> Void) {
            // Механизм безопасного обновления закреплённых сертификатов
            // с проверкой цифровой подписи
        }
    }
    
  4. Серверная стратегия graceful degradation

    • Поддержка старых и новых сертификатов в переходный период
    • Канареечное развёртывание новых сертификатов

Экстренный план действий

Если проблема возникла в продакшене:

  1. Немедленно обновить сертификат на сервере
  2. Включить временный allowlist для критически важных клиентов через механизм feature flags
  3. Подготовить хотфикс с ATS исключениями как последнее средство
  4. Уведомить пользователей через push-уведомления или in-app сообщения
  5. Ускорить ревью хотфикса в App Store через expedited review request

Ключевые рекомендации

  • Никогда не отключайте ATS полностью - это нарушает рекомендации App Store
  • Используйте pinning сертификатов только с механизмом обновления
  • Внедрите автоматический мониторинг сроков действия всех сертификатов
  • Имейте rollback-план на случай проблем с обновлением сертификатов
  • Тестируйте с истёкшими сертификатами в staging-окружении

Помните, что истёкшие сертификаты - это проблема безопасности, а не просто техническая неполадка. Все временные решения должны быть как можно быстрее заменены на постоянные с валидными сертификатами.

Что делать когда у сертификата истек срок действия? | PrepBro