CFNetwork SSLHandshake не вдався до iOS 9


207

хтось із iOS 9 beta 1 мав цю проблему?

Я використовую стандартний NSURLConnection для підключення до веб-сервісу, і як тільки дзвінок у веб-сервіс я отримую помилку нижче. Зараз це працює в iOS 8.3

Можлива бета-помилка? будь-які ідеї чи думки були б чудовими! Я знаю його дуже рано в розробці iOS 9

Ось повна помилка:

Збій CFNetwork SSLHandshake (-9824) Не вдалося завантажити NSURLSession / NSURLCз'єднання HTTP (kCFStreamErrorDomainSSL, -9824)

 NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://mywebserviceurl"]];
        NSURLResponse * response = nil;
        NSError * error = nil;
        NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
                                                  returningResponse:&response
                                                              error:&error];

Відповіді:


310

iOS 9 та OSX 10.11 вимагають TLSv1.2 SSL для всіх хостів, з яких ви плануєте запитувати дані, якщо ви не вкажете домени виключень у файлі Info.plist додатка.

Синтаксис для конфігурації 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 insecure HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Якщо ваша програма (наприклад, сторонній веб-браузер) потребує підключення до довільних хостів, ви можете налаштувати її так:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Якщо вам потрібно це зробити, можливо, найкраще оновити свої сервери для використання TLSv1.2 та SSL, якщо вони цього ще не роблять. Це слід вважати тимчасовим рішенням.

На сьогоднішній день в документації на попередній випуск жодним чином не згадується жоден із цих параметрів конфігурації. Як тільки це станеться, я оновлю відповідь, щоб посилатися на відповідну документацію.


1
Захист транспорту додатків (ATS) дозволяє додатку додавати декларацію до файлу Info.plist, який визначає домени, з якими вона потребує безпечного зв’язку. ОВС запобігає випадковому розголошенню, забезпечує безпечну поведінку за замовчуванням і його легко прийняти. Вам слід якомога швидше прийняти АТС, незалежно від того, створюєте ви новий додаток чи оновлюєте існуючий. Якщо ви розробляєте новий додаток, вам слід використовувати виключно HTTPS. Якщо у вас є вже наявний додаток, вам слід скористатися HTTPS якомога більше зараз, а також якнайшвидше створити план міграції решти свого додатка.
користувач3099837

2
@StevenPeterson Ей, Стів, я не можу отримати приклад домену винятків для роботи, чи є у вас випадкові випадки, я просто скопіював і вставив у .plist змінив TLSv1.1 на TLSv1.0, а домен на наш домен без https: // тощо
user3099837

27
Вибачте за довгий чат, але я зрозумів, що мені потрібно відключити <key> NSTemporaryExceptionRequiresForwardSecrecy </key> <false />
user3099837

2
@RashmiRanjanmallick NSTemporaryExceptionMinimumTLSVersion використовується для того, щоб повідомити ATS про те, що ви працюєте з сервером, який не є 1.2. Наприклад, використовуйте це, якщо ви намагаєтеся підключитися до хоста, який використовує TLS 1.0. Ви також повинні використовувати NSTemporaryExceptionRequiresForwardSecrecy, встановлений на false, як вказано вище user3099837.
Womble

2
ste.vn/2015/06/10/… - Це блог, звідки походить відповідь.
Шон Дев

66

В iOS 10+ рядок TLS ОБОВ'ЯЗКОВО повинен мати вигляд "TLSv1.0". Це не може бути просто "1,0". (Зітхає)


Наступна комбінація інших відповідей працює.

Скажімо, ви намагаєтеся підключитися до хоста (YOUR_HOST.COM), у якого є лише TLS 1.0.

Додайте їх до Info.plist свого додатка

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOUR_HOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

9
Здається, що додавання NSTemporaryExceptionRequiresForwardSecrecyзробило для мене трюк, дякую!
Джош Валдівієсо

2
Ця версія не працювала для мене в iOS9.1 - мені потрібно було використовувати формат рядка TLSVersion в одному з інших відповідей <key> NSTemvremeExceptionMinimumTLSVersion </key> <string> TLSv1.1 </string>
300baud

Це працює, але моє питання: чи означає це, що моя програма не використовує ssl, коли ці параметри ввімкнено, а дані не шифруються?
theDC

33

Для отримання додаткової інформації Конфігурація винятків безпеки транспорту додатків у iOS 9 та OSX 10.11

Цікаво, що ви помітите, що підключення намагається змінити протокол http на https, щоб захистити від помилок у вашому коді, якщо ви, можливо, випадково неправильно налаштували URL-адресу. У деяких випадках це може справді спрацювати, але це також заплутано.

Це доставка програм із безпекою транспорту додатків охоплює кілька хороших порад щодо налагодження

Збій ОВС

Більшість збоїв ОВС буде представлено як CFErrors з кодом серії -9800. Вони визначені у заголовку Security / SecureTransport.h

2015-08-23 06:34:42.700 SelfSignedServerATSTest[3792:683731] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

CFNETWORK_DIAGNOSTICS

Встановіть змінну середовища CFNETWORK_DIAGNOSTICS на 1, щоб отримати більше інформації на консолі про помилку

nscurl

Інструмент буде працювати через кілька різних комбінацій винятків ATS, намагаючись захистити безпечне з'єднання з даним хостом під кожною конфігурацією ATS та повідомити про результат.

nscurl --ats-diagnostics https://example.com

1
Тільки зазначте, що nscurl доступний лише в Mac OS X "El Capitan"
webo80

1
Ще одна порада щодо налагодження, щоб перевірити, який шифр підключення TLS використовується вашим сервером: curl -v https: // <ім'я>>
André Morujão

1
Будь-які ідеї щодо того, що може спричинити проблему, якщо загорнути PASS всі кроки добре?
Астон

@ onmyway133 Ви можете додати пояснення щодо того, як "Встановити змінну середовища CFNETWORK_DIAGNOSTICS на 1"?
YakirNa

1
@YakirNa ви можете прочитати про те, як це зробити тут nshipster.com/launch-arguments-and-environment-variables, це досить просто :)
onmyway133

2

Якщо ваш бекенд використовує захищений мурашник підключення, ви отримуєте використання NSURLSession

CFNetwork SSLHandshake failed (-9801)
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)

Вам потрібно перевірити конфігурацію сервера, особливо щоб отримати версію ATS та SSL сертифікат:

Замість того, щоб просто дозволити незахищене підключення , встановивши його NSExceptionAllowsInsecureHTTPLoads = YES, вам потрібно дозволити знижену безпеку у випадку, якщо ваш сервер не відповідає мінімальній вимозі (v1.2) для ATS (або краще виправити сторону сервера).

Дозволення зниженої безпеки на одному сервері

<key>NSExceptionDomains</key>
<dict>
    <key>api.yourDomaine.com</key>
    <dict>
        <key>NSExceptionMinimumTLSVersion</key>
        <string>TLSv1.0</string>
        <key>NSExceptionRequiresForwardSecrecy</key>
        <false/>
    </dict>
</dict>

використовувати клієнт openssl для дослідження сертифіката та отримання конфігурації вашого сервера за допомогою клієнта openssl:

openssl s_client  -connect api.yourDomaine.com:port //(you may need to specify port or  to try with https://... or www.)

.. знайдіть у кінці

SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: //
    Session-ID-ctx: 
    Master-Key: //
    Key-Arg   : None
    Start Time: 1449693038
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

Безпека транспортного забезпечення додатків (ATS) вимагає протоколу безпеки транспортного рівня (TLS) версії 1.2.

Вимоги до підключення за допомогою ATS:

Вимоги до з'єднання веб-служб для використання App Transport Security (ATS) включають сервер, шифри підключення та сертифікати, як зазначено нижче:

Сертифікати повинні бути підписані одним із таких типів ключів:

  • Ключ захищеного алгоритму 2 (SHA-2) із довжиною дайвінгу принаймні 256 (тобто SHA-256 або більше)

  • Ключ криптографії Elliptic-Curve (ECC) розміром не менше 256 біт

  • Ключ Rivest-Shamir-Adleman (RSA) довжиною не менше 2048 біт. Недійсний сертифікат призводить до жорсткої несправності та відсутності з'єднання.

Наступні шифри з'єднання підтримують передачу секретності (FS) та працюють з ATS:

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

Оновлення: виявляється, що openssl надає лише протокол мінімальної версії протоколу: посилання TLSv1


залишається питання, чи можна інтерпретувати інформацію opensl, щоб дізнатися, чи відповідає сервер вимозі. Також протокол: TLSv1 може бути версією makor замість 1.x
Ідалі

Я роблю це загальним, у разі використання порту
Ідалі

Відповідь залишає відкритими більше питань, ніж відповідей. Здається, проблемою можуть бути відображення між звітами opensl та документацією Apple. З виводу openssl неможливо визначити, чи підтримується TLS 1.2. Відповідь також не дозволяє визначити, чи підтримується Perfect Forward Secrecy.
zaph

2

Після двох днів спроб і невдач для мене спрацював цей код жіночості

з однією зміною, в відповідно до цієї посади , ми повинні припинити використання суб-ключі , пов'язані з NSExceptionDomains словник такого роду Конвенції

  NSTemporaryExceptionMinimumTLSVersion

І використовувати в новій Конвенції

  NSExceptionMinimumTLSVersion

замість цього.

яблучна документація

мій код

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>YOUR_HOST.COM</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.0</string>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>

1

Ще один корисний інструмент - nmap (варити встановити nmap)

nmap --script ssl-enum-ciphers -p 443 google.com

Дає вихід

Starting Nmap 7.12 ( https://nmap.org ) at 2016-08-11 17:25 IDT
Nmap scan report for google.com (172.217.23.46)
Host is up (0.061s latency).
Other addresses for google.com (not scanned): 2a00:1450:4009:80a::200e
PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.0: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.1: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: client
|_  least strength: C

Nmap done: 1 IP address (1 host up) scanned in 5.48 seconds

дуже корисна проблема налагодження сертифіката
Лопахін

0

Ця помилка відображалася в журналах іноді, коли я використовував помилкову / аварійну версію iOS Cordova iOS. Це пішло, коли я оновив або понизив програму iOS iOS.

Сервер, до якого я підключався, використовував SSL TLSv1.2, тому я знав, що це не проблема.


0

У .plistфайл свого проекту додайте цей дозвіл:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

0

Синтаксис для конфігурації 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 insecure HTTP requests-->
  <key>NSExceptionAllowsInsecureHTTPLoads</key>
  <true/>
  <!--Include to specify minimum TLS version-->
  <key>NSExceptionMinimumTLSVersion</key>
  <string>TLSv1.1</string>
   </dict>
 </dict>


0

Оновлений відповідь (після WWDC 2016):

Програми iOS потребуватимуть захищених HTTPS-підключень до кінця 2016 року. Якщо вимкнути ATS, можливо, згодом ваш додаток буде відхилено.

Безпека транспорту додатків або ATS - це функція, яку Apple представила в iOS 9. Коли ATS увімкнено, вона змушує програму підключатися до веб-служб через з'єднання HTTPS, а не незахищений HTTP.

Однак розробники все ще можуть вимкнути ATS та дозволити їх програмам надсилати дані через HTTP-з'єднання, як зазначено у вищезазначених відповідях. Наприкінці 2016 року Apple зробить ATS обов'язковим для всіх розробників, які сподіваються подати свої додатки в App Store. посилання


0

Пристрій, який я тестував, був встановлений неправильно. Тож коли я спробував отримати доступ до сторінки з сертифікатом, який незабаром закінчиться, він заборонить доступ, оскільки пристрій, хоча термін дії сертифікату минув. Щоб виправити, встановіть належний час на пристрої!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.