Как загрузить URL-адрес HTTP с защитой транспорта приложений, включенной в iOS 9?

Итак, новый бета-SDK iOS, выпущенный прошлой ночью, имеет "App Transport Security", который поощряет разработчиков использовать https вместо http. В принципе, это отличная идея, и я уже использую https в наших промежуточных/производственных средах. Тем не менее, у меня нет https, настроенных в моей локальной среде разработки, когда приложение iOS подключается к веб-службе, которую я запускаю на своем ноутбуке.

Из-за небольшого количества игр сегодня утром кажется, что система загрузки URL-адресов, даже если вы передадите URL-адрес http, вместо этого решите использовать https. Кто-нибудь знает, как отключить это поведение - даже для определенных URL-адресов?

Ответ 1

См. "Яблоки" ссылка Info.plist для получения полной информации (спасибо @gnasher729).

Вы можете добавлять исключения для определенных доменов в свой Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>testdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>

Все ключи для каждого исключенного домена являются необязательными. Оратор не уточнил ни один из ключей, но я думаю, что они все разумно очевидны.

(Источник: WWDC 2015 сессия 703, "Конфиденциальность и ваше приложение" , 30:18)

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

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

Если ваше приложение не имеет веской причины, вы можете отказаться от него:

Настройка NSAllowsArbitraryLoads на true позволит ему работать, но Apple очень поняла, что они намерены отклонить приложения, которые используют этот флаг без какой-либо конкретной причины. Основная причина использования NSAllowsArbitraryLoads, о которой я могу думать, - это созданный пользователем контент (обмен ссылками, пользовательский веб-браузер и т.д.). И в этом случае Apple по-прежнему ожидает, что вы включите исключения, которые обеспечивают соблюдение ATS для URL-адресов, которыми вы управляете.

Если вам нужен доступ к определенным URL-адресам, которые не передаются через TLS 1.2, вам нужно написать определенные исключения для этих доменов, а не использовать NSAllowsArbitraryLoads, установленный в yes. Вы можете найти дополнительную информацию в сеансе WWW NSURLSesssion.

Будьте внимательны при совместном использовании решения NSAllowsArbitraryLoads. Это не рекомендуемое исправление от Apple.

- kcharwood (спасибо @marco-tolman)

Ответ 2

В качестве принятого ответа была предоставлена ​​необходимая информация, а для получения дополнительной информации об использовании и отключении App Transport Security можно найти больше об этом.

Для исключений для домена добавьте их в Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Но что, если я не знаю всех небезопасных доменов, которые мне нужно использовать? Используйте следующий ключ в Info.plist

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

Более подробную информацию вы можете получить по этой ссылке.

Ответ 3

Далее this.

Я решил это с добавлением некоторого ключа в info.plist. Следующие шаги были следующими:

  • Открыл мои проекты info.plist файл

  • Добавлен ключ с именем NSAppTransportSecurity как Dictionary.

  • Добавлен подраздел под названием NSAllowsArbitraryLoads как Boolean и установите его значение YES как показано на следующем рисунке. введите описание изображения здесь

Очистите проект, и теперь все работает нормально, как раньше.

Ссылка Ссылка.

Ответ 4

Если вы просто хотите отключить политику транспорта приложений для локальных серверов-разработчиков, то следующие решения работают хорошо. Это полезно, когда вы не можете или непрактично настраивать HTTPS (например, при использовании сервера разработчика Google App Engine).

Как говорили другие, ATP, безусловно, не следует отключать для производственных приложений.

1) Используйте другой plist для Debug

Скопируйте файл Plist и файл NSAllowsArbitraryLoads. Используйте этот Plist для отладки.

XCode Debug

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

2) Исключить локальные серверы

В качестве альтернативы вы можете использовать один файл plist и исключать определенные серверы. Тем не менее, не похоже, что вы можете исключить IP-адреса, поэтому вам может потребоваться вместо этого использовать имя сервера (в разделе "Системные настройки" → "Обмен" или ваш локальный DNS).

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>server.local</key>
        <dict/>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
    </dict>
</dict>

Ответ 5

Я решил как файл plist.

  • Добавьте словарь NSAppTransportSecurity:.
  • Добавить подраздел под названием "NSAllowsArbitraryLoads" как логический: YES

введите описание изображения здесь

Ответ 6

Конфигурации выше не работали для меня. Я пробовал много комбинаций клавиш, этот режим отлично работает:

введите описание изображения здесь

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>mydomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

Ответ 7

Компиляция ответов, полученных @adurdin и @User

Добавьте в свой info.plist и измените localhost.com на соответствующее имя домена, вы также можете добавить несколько доменов:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>
</plist>

Вы info.plist должны выглядеть так:

введите описание изображения здесь

Ответ 8

Вот что сработало для меня:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key><!-- your_remote_server.com / localhost --></key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
        </dict>
    <!-- add more domain here -->
    </dict>
</dict>

Я просто хочу добавить это, чтобы помочь другим и сэкономить время:

если вы используете: CFStreamCreatePairWithSocketToHost. убедитесь, что ваш host совпадает с тем, что у вас есть в .plist, или если у вас есть отдельный домен для сокета, просто добавьте его там.

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);

Надеюсь, это полезно. Приветствия.:)