kCFStreamErrorDomainSSL, -9802 при подключении к серверу по IP-адресу через HTTPS в iOS 9

У нас есть приложение для iOS, которое подключается к нашему серверу через HTTPS. Когда приложение создается с новым iOS 9 SDK и работает под iOS 9, возникает следующая ошибка:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

Приложение использует AFNetworking 1.3.4 с закрепленными сертификатами. Проблема возникает, если я подключаюсь к серверу с его IP-адресом. Это работает, если я добавлю конфигурацию NSAllowsArbitraryLoads или если я подключусь к серверу с его доменным именем.

Соединитель Tomcat настроен с sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2".

Я попытался переопределить имя хоста, но оно, похоже, ничего не меняет.

Я пока не могу найти много официальной документации по ATS. Может быть, соединение с IP-адресом не должно работать?

5 ответов

Решение

iOS9 требует, чтобы сервер поддерживал только TLSv1.2 и поддерживал идеальную безопасность пересылки.

Также требуется, чтобы приложение поддерживало IPV6, в том числе не используя жестко закодированные IP-адреса. Предлагается использовать NSURLSession, В противном случае в список приложений должны быть внесены исключения.

Смотрите сессию WWDC-15 "Безопасность и ваши приложения".

Также см . Блог Стивена Петерсона для деталей.

Вы можете добавить это в свой файл "Info.plist", это позволит использовать незащищенные соединения:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Я нашел другой ответ о переполнении стека с контрольным списком точных новых требований на сервере, чтобы полностью заполнить приложение безопасности транспорта по умолчанию для iOS 9: Контрольный список требований к безопасности сервера iOS 9

Надеюсь, это поможет.

Я застрял на этом некоторое время и попробовал все приемы в Info.plist, но все еще имел ошибку:

HTTP load failed (kCFStreamErrorDomainSSL, -9813)

при попытке подключиться к локальному серверу в разработке.

Локально разрабатывая собственный реагирующий проект, подключающийся к API, который поставляется с самозаверяющим сертификатом, я настроил систему на доверие к сертификату, но мне потребовалось некоторое время, чтобы осознать, что мне также нужен симулятор IOS, чтобы принять мой сертификат как доверенный, чтобы пройти эта ошибка.

На главном экране вашего симулятора вы сможете перетащить файл сертификата в симулятор, чтобы предложить ему добавить профиль сертификата. Или, если сертификат доступен через локальный URL-адрес в браузере Safari на симуляторе, вы можете принять его через Safari.

Надеюсь, это кому-то поможет, когда я ходил кругами, прежде чем это щелкнуло!

Решение 1:

Если вы ищете work around затем используйте следующий подход:

  1. Добавьте ключ NSAllowsArbitraryLoads типа boolean со значением true.

Ваш файл Info.plist должен выглядеть следующим образом:

Снимок экрана 1

Однако такой подход не рекомендуется, поскольку он разрешает все незащищенные соединения.

Решение 2:

SSL certificate that you apply on Server should be of type TLSv2.0 minimum since iOS 10 requires this.Проверьте эту ссылку для деталей.

  1. Добавьте ключ NSIncludeSubdomains типа boolean со значением true
  2. Добавьте ключ NSTeditionalExceptionAllowsInsecureHTTPLoads типа boolean со значением true
  3. Добавьте ключ NSTeditionalExceptionMinimumTLSVersion типа String со значением TLSv1.2

Ваш файл Info.plist должен выглядеть следующим образом:

Снимок экрана 2

Другие вопросы по тегам