Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое ATS (App Transport Security)?
ATS (App Transport Security) — это функция безопасности, введённая Apple в iOS 9 и macOS 10.11, которая обеспечивает обязательное использование защищённых сетевых соединений для приложений. Основная цель — усилить конфиденциальность и целостность данных, передаваемых между приложением и внешними серверами, путём принудительного применения современных протоколов и шифрования.
Ключевые требования ATS
ATS налагает строгие требования на все исходящие HTTP/HTTPS-соединения (через URLSession, NSURLConnection и другие API). По умолчанию приложение должно соблюдать следующие правила:
- Обязательное использование HTTPS вместо HTTP.
- Минимальная версия TLS 1.2 для протокола шифрования.
- Современные алгоритмы шифрования, такие как AES-128 или AES-256 с Forward Secrecy.
- Сертификаты, подписанные хотя бы SHA-256 (или более стойкими алгоритмами).
- Достоверные корневые и промежуточные сертификаты от доверенных центров сертификации (CA).
Если сервер не соответствует этим требованиям, соединение будет прервано системой, и приложение получит ошибку (например, NSURLErrorSecureConnectionFailed или NSURLErrorServerCertificateHasBadDate).
Настройка ATS через Info.plist
Для совместимости со старыми серверами или сторонними API, которые не соответствуют стандартам ATS, разработчики могут частично ослабить политики. Это делается путём добавления исключений в словарь NSAppTransportSecurity внутри файла Info.plist.
Пример настройки Info.plist для отключения ATS для конкретного домена:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key://api.example.com</key>
<dict>
<!-- Разрешить незашифрованные HTTP-запросы -->
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!-- Разрешить использование устаревших версий TLS -->
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
</dict>
</dict>
</dict>
Важные ключи для исключений:
NSAllowsArbitraryLoads— глобальное отключение ATS для всех доменов (крайне не рекомендуется, требует обоснования при отправке в App Store).NSExceptionAllowsInsecureHTTPLoads— разрешает HTTP для указанного домена.NSExceptionMinimumTLSVersion— задаёт минимально допустимую версию TLS (например,TLSv1.1).NSRequiresCertificateTransparency— требует прозрачности сертификатов.
Практическое значение для разработчика
- Безопасность по умолчанию: ATS делает безопасные соединения стандартом, защищая пользователей от перехвата данных (man-in-the-middle-атак).
- Побуждение к модернизации: Мотивирует владельцев серверов обновлять свою инфраструктуру до современных стандартов.
- Контроль App Store: С 2017 года Apple требует разумного обоснования для любых исключений ATS (особенно для
NSAllowsArbitraryLoads) при ревью приложения. Необоснованные ослабления политик могут привести к отклонению билда. - Отладка: При сетевых сбоях важно проверять логи на наличие ATS-ошибок. Инструменты вроде
nscurl --ats-diagnostics <URL>в терминале помогают проверить совместимость сервера с требованиями ATS.
Пример обработки в коде
Хотя настройки производятся в Info.plist, в коде вы можете более гибко управлять безопасностью через конфигурацию URLSession.
// Создание кастомной конфигурации сессии
let config = URLSessionConfiguration.default
// Важно: настройки в Info.plist имеют приоритет над этими свойствами.
// Данный код актуален, только если ATS для домена уже ослаблен в plist.
config.tlsMinimumSupportedProtocolVersion = .TLSv12
// Или через старый API:
// config.TLSMinimumSupportedProtocol = .tlsProtocol12
let session = URLSession(configuration: config)
// Попытка загрузки данных
if let url = URL(string: "https://api.example.com/data") {
let task = session.dataTask(with: url) { data, response, error in
if let error = error as NSError? {
// Проверяем, связана ли ошибка с ATS
if error.domain == NSURLErrorDomain &&
error.code == NSURLErrorAppTransportSecurityRequiresSecureConnection {
print("Сбой ATS: сервер не соответствует требованиям безопасности.")
}
// Обработка других ошибок...
return
}
// Обработка успешного ответа...
}
task.resume()
}
Итог: ATS — это не просто «техническая деталь», а фундаментальный механизм безопасности в iOS/macOS экосистеме. Разработчик должен стремиться к полному его соблюдению, а любые исключения — тщательно обосновывать и документировать, обеспечивая максимальную защиту пользовательских данных.