Ошибка 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, но пропустили некоторые другие требования.

Вот полный контрольный список:

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

Добавьте ниже ключ в ваш 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 файл с NSAllowsArbitraryLoadsBool установлен в 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;
Другие вопросы по тегам