Загрузка приложения iOS 9 с Amazon S3 Ошибка SSL: поддержка TLS 1.2

я получил

Произошла ошибка SSL, и невозможно установить безопасное соединение с сервером.

на iOS 9, если я попытаюсь загрузить файл с amazon s3: https://s3.amazonaws.com/xyz/qer/IMG_0001.JPG

Насколько я понимаю, Amazon s3 поддерживает TLS 1.2, см. https://forums.aws.amazon.com/thread.jspa?threadID=192512

В настоящее время S3 и Kinesis поддерживают TLS 1.2.  введите описание изображения здесь

«В настоящее время S3 и Kinesis поддерживают TLS 1.2». 23 августа 2015 г., 21:19

Не знаю, почему я получаю эту ошибку SSL. Учетная запись должна быть настроена для использования TLS 1.2? Я бы предположил, что по умолчанию это должно быть включено.

Я не хочу помещать этот домен в информационный лист.

РЕДАКТИРОВАТЬ: в итоге я использовал

<key>NSAppTransportSecurity</key> 
<dict> 
  <key>NSExceptionDomains</key> 
  <dict> 
    <key>s3.amazonaws.com</key> 
    <dict> 
      <key>NSExceptionRequiresForwardSecrecy</key> 
        <false/> 
      <key>NSIncludesSubdomains</key> 
        <true/> 
    </dict> 
  </dict> 
</dict>

person Zsolt    schedule 10.09.2015    source источник
comment
добавление этих ключей и значений dict в мой список заставило это сообщение об ошибке исчезнуть ...   -  person Bill Noto    schedule 15.09.2015
comment
Верно. Это описано в mobile.awsblog.com/post / Tx2QM69ZE6BGTYX /, и это хороший способ подмести вещи под ковер. Я действительно надеюсь, что Amazon решит эту проблему, и разработчикам не потребуется писать для них исключения.   -  person Anand Bhat    schedule 18.09.2015
comment
Давний и уважаемый инженер Apple сказал на forum.developer.apple.com/thread/ 13472, что NSExceptionRequiresForwardSecrecy НЕ следует использовать для решения этой проблемы: оказывается, что тот факт, что NSExceptionRequiresForwardSecrecy ослабляет требование SHA-2/256, является ошибкой. Вместо этого используйте NSExceptionAllowsInsecureHTTPLoads.   -  person Pol    schedule 25.10.2015


Ответы (5)


Изменить 2016-01-03: обновленный сертификат для s3.amazonaws.com использует алгоритм SHA256 и соответствует требованиям ATS.

Исходный ответ: s3.amazonaws.com использует сертификат SHA1, который не соответствует требованиям ATS, что приводит к серьезному сбою. В соответствии с Техникой безопасности транспорта приложений, ATS в iOS9 имеет следующие требования:

  1. Сервер должен поддерживать протокол TLS версии не ниже 1.2.

  2. # P4 #
    # P5 #
  3. Сертификаты должны быть подписаны с использованием алгоритма хеширования подписи SHA256 или более высокого уровня, с ключом RSA длиной 2048 бит или больше, либо ключом эллиптической кривой (ECC) длиной 256 бит или больше.

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

Тест SSL-сервера SSL Labs (https://www.ssllabs.com/ssltest/analyze.html?d=s3.amazonaws.com) включает моделирование рукопожатия для ATS в iOS 9, которое указывает на сбой для s3.amazonaws.com.

Dev SSL Labs

person Anand Bhat    schedule 10.09.2015
comment
Похоже, что Amazon обновила свой сертификат. - person Adam S; 17.12.2015
comment
Спасибо! Обновленный ответ, чтобы указать на это изменение - person Anand Bhat; 04.01.2016

Вам нужны две вещи, чтобы приложение iOS 9 успешно достигло конечной точки SSL (S3 - это только пример):

  • На сервере включена прямая секретность (https://www.wikiwand.com/en/Forward_secrecy) .

    В настоящее время эта функция не поддерживается AWS S3. Чтобы решить эту проблему, вы можете настроить сервис AWS CloudFront (который поддерживает FS) перед своей корзиной S3. Настроить довольно просто. Если вы используете CORS, имейте в виду, что правильные заголовки необходимо передавать через прокси CloudFront.

  • SSL-сертификат, защищенный SHA-256 на сервере.

    Как только ваши файлы станут доступны через Cloudfront, при нажатии URL (https://somethinghashed1234wasdfawer421.cloudfront.net) вы заметите, что там SSL-сертификат использует SHA-1. Как плохо ... Решение для этого - защитить это с помощью вашего частного SSL-сертификата SHA-256. Для этого вам необходимо указать CNAME для конечной точки Cloudfront в вашем домене. Это позволит вам защитить корзину с помощью собственного SSL-сертификата. Просто настройте свой DNS так, чтобы запись указывала cloudfront-bucket.mydomain.com на это уродливое somethinghashed1234wasdfawer421.cloudfront.net. Загрузите сертификат SSL на Amazon и установите защиту SSL в настройках распространения Cloudfront. Вуаля!

Все упомянутые элементы легко доступны в консоли AWS (кроме загрузки сертификата SSL, которая должна выполняться через интерфейс командной строки AWS).

person mieciu    schedule 17.09.2015
comment
В каком источнике говорится, что прямая секретность не поддерживается S3? Я не нашел ничего очевидного. - person Pol; 25.10.2015
comment
Не могу придумать ни одного источника, я проверил это с помощью одного из моих инструментов отладки SSL (nmap, openssl client или какое-то онлайн-приложение для браузера). - person mieciu; 26.10.2015
comment
Это проблема экземпляров AWS S3 в целом или отдельных серверов, работающих на этих серверах? (Я использую свой собственный сервер). - person Chris Prince; 25.05.2017

Поскольку S3 в настоящее время не полностью соответствует требованиям, согласно в этом сообщении в блоге AWS их официальная рекомендация - исключить S3 из App Transport Security, добавив этот набор ключей в ваш Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSExceptionDomains</key>
      <dict>
            <key>amazonaws.com</key>
            <dict>
                  <key>NSThirdPartyExceptionMinimumTLSVersion</key>
                  <string>TLSv1.0</string>
                  <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                  <false/>
                  <key>NSIncludesSubdomains</key>
                  <true/>
            </dict>
            <key>amazonaws.com.cn</key>
            <dict>
                  <key>NSThirdPartyExceptionMinimumTLSVersion</key>
                  <string>TLSv1.0</string>
                  <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                  <false/>
                  <key>NSIncludesSubdomains</key>
                  <true/>
            </dict>
      </dict>
</dict>

ОБНОВЛЕНИЕ 27.10.15: как Пол указывает в комментариях, хотя это официальный ответ AWS, инженера Apple в форумы поддержки говорят, что это действительно ошибка:

Оказалось, что тот факт, что NSExceptionRequiresForwardSecrecy ослабляет требование SHA-2/256, является ошибкой; предполагаемое поведение NSExceptionRequiresForwardSecrecy - это поведение, задокументированное в Техническом примечании по безопасности транспорта приложений, а именно, что он должен просто включать определенные наборы шифрования.

Мы планируем исправить эту ошибку в будущем. Мы планируем исправить это каким-либо совместимым образом, чтобы люди, которые по ошибке использовали NSExceptionRequiresForwardSecrecy для отключения требования SHA-2/256, не сломались. Однако предсказать будущее всегда сложно. Это подводит нас к тому, что вам следует делать прямо сейчас. [Предыдущая версия этого поста давала менее конкретные советы. Следующее - обновление, которое ужесточает ситуацию.] После обсуждения этого с ATS Engineering наши рекомендации:

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

В подобных ситуациях, когда сервер полностью совместим с ATS, за исключением требования подписи сертификата SHA-2/256, мы рекомендуем вам точно задокументировать это состояние с помощью NSExceptionAllowsInsecureHTTPLoads.

Вам следует как можно скорее попытаться сделать ваш сервер полностью совместимым с ATS.

Когда это произойдет, вам следует обновить свое приложение, установив более безопасные настройки ATS.

Я должен подчеркнуть, что NSExceptionAllowsInsecureHTTPLoads на самом деле небезопасен. Это так же безопасно, как и ваше приложение в настоящее время, когда оно работает на iOS 8. Скорее, это означает, что ваше приложение не получает преимуществ от дополнительной безопасности, предоставляемой ATS. Делитесь и наслаждайтесь

Акцент мой. Обратите внимание, что текущий план состоит в том, чтобы исправить ошибку таким образом, чтобы не нарушить поведение людей, которые использовали NSExceptionRequiresForwardSecrecy для решения этой проблемы, поэтому приведенный выше ответ по-прежнему является жизнеспособным.

person markquezada    schedule 18.09.2015
comment
У меня это сработало, я использую последнюю версию AWS SDK v2.2.6, вам может потребоваться обновить SDK. - person Zee; 29.09.2015
comment
Давний и уважаемый инженер Apple сказал на forum.developer.apple.com/thread/ 13472, что NSExceptionRequiresForwardSecrecy НЕ следует использовать для решения этой проблемы: оказывается, что тот факт, что NSExceptionRequiresForwardSecrecy ослабляет требование SHA-2/256, является ошибкой. Вместо этого используйте NSExceptionAllowsInsecureHTTPLoads. - person Pol; 25.10.2015

Просто укажите, что проблема с сертификатами Amazon заключается в том, что они используют SHA-1, а для безопасности транспорта приложения требуется SHA-2/256.

Тот факт, что NSExceptionRequiresForwardSecrecy работает, является ошибкой, описанной здесь, на форумах разработчиков Apple. Согласно документации и инженеру Apple в связанном потоке, «лучшим» решением было бы

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>s3.amazonaws.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict> 
    </dict> 
</dict>

Я использую термин «лучше» очень вольно и имею в виду только решение, не содержащее ошибки, которую Apple со временем исправит. Теперь это исправление только проблемы с сертификатом :)

person tmeisenh    schedule 25.09.2015
comment
Когда я впервые попробовал это решение, и оно у меня не сработало, я заметил, что URL-адрес S3 немного отличается. Вместо s3.amazonaws.com попробуйте использовать amazonaws.com (без s3). Это сработало для меня. - person Vladan; 01.10.2015
comment
@Vladan: изменение URL-адреса, как вы описываете, для меня не сработало. - person seeker12; 02.10.2015

Пока Amazon не избавится от своих * ss по этому поводу, поскольку @Zsolt предложил вставить следующие ключи и значения в ваш файл plist.

НО не забудьте установить для NSExceptionDomain значение amazonaws.com вместо s3.amazonaws.com, в зависимости от того, как обслуживаются ваши активы и из какого региона Amazon может их обслуживать, например этот s3-us-west-1.amazonaws.com, поэтому не устанавливайте явно субдомен позволит правильно обслуживать ресурсы с любого идентификатора региона AWS.

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
person heading_to_tahiti    schedule 27.10.2015