ошибка SSL ATS iOS 9 с поддерживающим сервером

Я установил 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 Транспортной Безопасности.

оказалось, что мы работаем с TLS v1.2 но отсутствовали некоторые другие требования.

вот полный список:

  1. TLS требует, по крайней мере, версия 1.2.
  2. шифры соединения ограничены к тем которые обеспечивают переднюю секретность (см. ниже для списка шифров.)
  3. сервис требуется сертификат, использующий по крайней мере отпечаток пальца SHA256 с битом 2048 или большим ключом RSA, или 256-битным или большим ключом эллиптической кривой (ECC).
  4. недопустимые сертификаты приводят к жесткому сбою и отсутствию соединения.

принятые шифры:

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 как можно больше прямо сейчас и создайте план переноса остальной части вашего приложения как как можно скорее.

добавить ниже ключ в вашей информации.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>

проверить этот документ это предоставлено apple.

у меня была аналогичная проблема во время выполнения на iOS 9, и то, что я сделал, чтобы исправить это, было добавлено NSAppTransportSecurity словарь мой С NSAllowsArbitraryLoads Bool значение true и после очистки и восстановления он работал.

надеюсь, это поможет!


для меня прокси блокировал попытку использовать интернет из другого источника решит проблему. Wifi, Lan, etc.


С 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;