Ошибка iOS 9 ATS SSL с сервером поддержки
Я установил Xcode 7 и попытался запустить свое приложение под iOS 9. Я получаю печально известную ошибку: Connection failed! Error - -1200 An SSL error has occurred and a secure connection to the server cannot be made.
Дело в том, что мой сервер поддерживает TLSv1.2, и я использую NSURLSession
,
В чем может быть проблема тогда?
5 ответов
Apple выпустила полный список требований к App Transport Security.
Выяснилось, что мы работали с TLS v1.2, но пропустили некоторые другие требования.
Вот полный контрольный список:
- TLS требует как минимум версии 1.2.
- Соединительные шифры ограничены теми, которые обеспечивают прямую секретность (список шифров см. Ниже).
- Службе требуется сертификат, использующий, по крайней мере, отпечаток SHA256 с ключом RSA 2048 бит или более, либо ключ эллиптической кривой (ECC) 256 бит или более.
- Недействительные сертификаты приводят к серьезному отказу и отсутствию соединения.
Принятые шифры:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
В iOS9 Apple добавила новую функцию под названием App Transport Security (ATS).
ATS применяет лучшие практики во время сетевых вызовов, включая использование HTTPS.
Предварительная документация Apple:
ATS предотвращает случайное раскрытие, обеспечивает безопасное поведение по умолчанию и проста в применении. Вы должны принять ATS как можно скорее, независимо от того, создаете ли вы новое приложение или обновляете существующее.
Если вы разрабатываете новое приложение, вы должны использовать исключительно HTTPS. Если у вас есть существующее приложение, вы должны использовать HTTPS настолько, насколько вы можете прямо сейчас, и составить план миграции остальной части вашего приложения как можно скорее.
Добавьте ниже ключ в ваш info.plist и затем посмотрите.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Даже вы можете добавить конкретное исключение,
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>testdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<false/>
<key>NSExceptionAllowInsecureHTTPSLoads</key>
<false/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowInsecureHTTPSLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
...
</dict>
</dict>
Проверьте этот документ, который предоставил яблоко.
У меня была похожая проблема во время выполнения на iOS 9, и что я сделал, чтобы исправить это, было добавлено NSAppTransportSecurity
Словарь к моему info.plist
файл с NSAllowsArbitraryLoads
Bool
установлен в true
и после очистки и восстановления это сработало.
Надеюсь, это поможет!
Для меня прокси блокировка попытаться использовать Интернет из другого источника решит проблему. Wifi, Lan и т. Д.
С iOS9 у меня была та же проблема: хотя в результате SSLlab не было проблем с протоколами / шифрами на моем сервере, соединение с одним конкретным URL не удалось на iPad под управлением iOS/9.3.5 с ошибкой SSL:
Connection cannot be established.
Моя глупая ошибка заключалась в том, что у меня был редирект, то есть в NGINX (и аналогичный в Apache):
rewrite /calendar $scheme://www.example.org/resources/calendar;
Если пользователь получил доступ /calender
установив:
https://example.org/calendar
сервер перенаправлен на другой домен, нарушая установление SSL-соединения.
Установка перенаправления следующим образом исправила это:
rewrite /calendar $scheme://$server_name/resources/calendar;