Что делать когда у сертификата истек срок действия?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение проблемы с истёкшим SSL-сертификатом в iOS-приложениях
Когда у SSL-сертификата истекает срок действия, это создаёт критическую проблему для iOS-приложений, так как система безопасности Apple (App Transport Security) по умолчанию блокирует сетевые запросы к серверам с невалидными сертификатами. Решение зависит от того, кто является владельцем сертификата и где возникла проблема.
Если сертификат на вашем собственном сервере
Немедленные действия для администратора сервера:
- Обновление сертификата у вашего SSL-провайдера (Let's Encrypt, Comodo, DigiCert и др.)
- Установка нового сертификата на все серверы (включая балансировщики нагрузки и CDN)
- Проверка цепочки доверия с помощью инструментов типа
opensslили онлайн-валидаторов - Обновление промежуточных сертификатов при необходимости
Временные решения на стороне клиента (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
}
}
Долгосрочные стратегии предотвращения проблем
-
Мониторинг сроков действия сертификатов
- Настройка автоматических уведомлений за 30, 14 и 7 дней до истечения
- Использование сервисов мониторинга (CertExpiry, UptimeRobot)
-
Автоматическое обновление сертификатов
- Настройка авто-обновления через Let's Encrypt и Certbot
- Использование контейнеров с автоматическим rotation сертификатов
-
Стратегия pinning с механизмом обновления
class CertificateManager { static var pinnedCertificates: [Data] { // Загрузка из безопасного источника с возможностью обновления // например, с вашего CDN с проверенной подписью } static func updatePinnedCertificates(from url: URL, completion: @escaping (Bool) -> Void) { // Механизм безопасного обновления закреплённых сертификатов // с проверкой цифровой подписи } } -
Серверная стратегия graceful degradation
- Поддержка старых и новых сертификатов в переходный период
- Канареечное развёртывание новых сертификатов
Экстренный план действий
Если проблема возникла в продакшене:
- Немедленно обновить сертификат на сервере
- Включить временный allowlist для критически важных клиентов через механизм feature flags
- Подготовить хотфикс с ATS исключениями как последнее средство
- Уведомить пользователей через push-уведомления или in-app сообщения
- Ускорить ревью хотфикса в App Store через expedited review request
Ключевые рекомендации
- Никогда не отключайте ATS полностью - это нарушает рекомендации App Store
- Используйте pinning сертификатов только с механизмом обновления
- Внедрите автоматический мониторинг сроков действия всех сертификатов
- Имейте rollback-план на случай проблем с обновлением сертификатов
- Тестируйте с истёкшими сертификатами в staging-окружении
Помните, что истёкшие сертификаты - это проблема безопасности, а не просто техническая неполадка. Все временные решения должны быть как можно быстрее заменены на постоянные с валидными сертификатами.