El sıkışma başarısız oldu iOS 9


207

iOS 9 beta 1 kullanan herkes bu sorunu yaşadı mı?

Bir web servisine bağlanmak için standart NSURLConnection kullanın ve web servisine bir çağrı yapılır yapılmaz aşağıdaki hatayı alıyorum. Bu şu anda iOS 8.3'te çalışıyor

Olası beta hatası? herhangi bir fikir veya düşünce harika olurdu! İOS 9 geliştirmede çok erken olduğunu biliyorum

İşte tam hata:

CFNetwork SSLHandshake başarısız oldu (-9824) NSURLSession / NSURLConnection HTTP yükü başarısız oldu (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];

Yanıtlar:


310

iOS 9 ve OSX 10.11, uygulamanızın Info.plist dosyasında istisna alan adları belirtmediğiniz sürece veri istemeyi planladığınız tüm ana bilgisayarlar için TLSv1.2 SSL gerektirir.

Info.plist yapılandırmasının sözdizimi şöyle görünür:

<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>

Uygulamanızın (örneğin bir üçüncü taraf web tarayıcısı) rastgele ana bilgisayarlara bağlanması gerekiyorsa, uygulamayı şu şekilde yapılandırabilirsiniz:

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

Bunu yapmak zorundaysanız, muhtemelen sunucularınızı, henüz yapmadılarsa TLSv1.2 ve SSL kullanacak şekilde güncellemek en iyisidir. Bu geçici bir çözüm olarak düşünülmelidir.

Bugün itibariyle, yayın öncesi dokümantasyon bu yapılandırma seçeneklerinden hiçbirini belirli bir şekilde belirtmemektedir. Bunu yaptıktan sonra, ilgili dokümanlara bağlantı vermek için cevabı güncelleyeceğim.


1
Uygulama Aktarım Güvenliği (ATS), bir uygulamanın Info.plist dosyasına güvenli iletişim gerektirdiği etki alanlarını belirten bir bildirim eklemesine izin verir. ATS, yanlışlıkla açığa çıkmayı önler, güvenli varsayılan davranış sağlar ve benimsenmesi kolaydır. İster yeni bir uygulama oluşturuyor olun, ister mevcut bir uygulamayı güncelleyin, ATS'yi en kısa zamanda kabul etmelisiniz. Yeni bir uygulama geliştiriyorsanız, HTTPS'yi yalnızca kullanmalısınız. Mevcut bir uygulamanız varsa, HTTPS'yi şu anda kullanabildiğiniz kadar kullanmalı ve uygulamanızın geri kalanını mümkün olan en kısa sürede taşımak için bir plan oluşturmalısınız.
user3099837

2
@StevenPeterson hey steve ben istisnalar etki alanı örneği işe almak için görünmüyor, şans eseri herhangi bir fikrin var mı, ben sadece kopyaladı ve .plist TLSv1.1 TLSv1.0 ve etki alanı https olmadan bizim etki alanına yapıştırıldı: // vb
user3099837

27
Uzun sohbet için üzgünüm ama anladım <key> NSTemporaryExceptionRequiresForwardSecrecy </key> <false />
user3099837 10:15

2
@RashmiRanjanmallick NSTemporaryExceptionMinimumTLSVersion, ATS'ye 1.2 olmayan bir sunucuyla çalıştığınızı bildirmek için kullanılır. Örneğin, TLS 1.0 kullanan bir ana bilgisayara bağlanmaya çalışıyorsanız bunu kullanın. Ayrıca yukarıda belirtilen user3099837 olarak NSTemporaryExceptionRequiresForwardSecrecy öğesini false olarak ayarlamanız gerekir.
Womble

2
ste.vn/2015/06/10/… - Cevabın kaynaklandığı blog.
Sean Dev

66

İOS 10 ve sonraki sürümlerinde TLS dizesi "TLSv1.0" biçiminde OLMALIDIR. Sadece "1.0" olamaz. (İç çekmek)


Diğer Yanıtların aşağıdaki kombinasyonu çalışır.

Diyelim ki yalnızca TLS 1.0 olan bir ana bilgisayara (YOUR_HOST.COM) bağlanmaya çalışıyorsunuz.

Bunları uygulamanızın Info.plist'e ekleyin

<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
Ekleme NSTemporaryExceptionRequiresForwardSecrecybenim için hile yaptı gibi görünüyor , teşekkürler!
Josh Valdivieso

2
Bu sürüm iOS9.1'de benim için çalışmadı - TLSVersion dize biçimini diğer cevaplardan birinde kullanmam gerekiyordu <key> NSTemporaryExceptionMinimumTLSVersion </key> <string> TLSv1.1 </string>
300baud

Bu işe yarıyor ama sorum şu: bu parametreler açıkken ve veriler şifrelenmediğinde uygulamamın ssl kullanmadığı anlamına mı geliyor?
theDC

33

Daha fazla bilgi için iOS 9 ve OSX 10.11'de Uygulama Aktarımı Güvenlik İstisnalarını Yapılandırma

İlginç bir şekilde, bağlantının, yanlışlıkla URL'yi yanlış yapılandırmış olabileceğiniz kodunuzdaki hatalara karşı korumak için http protokolünü https olarak değiştirmeye çalıştığını fark edeceksiniz. Bazı durumlarda, bu gerçekten işe yarayabilir, ancak aynı zamanda kafa karıştırıcıdır.

Bu Nakliye App Taşıma Güvenliği ile bir Uygulama bazı iyi hata ayıklama ipuçları kapsar

ATS Hatası

Çoğu ATS hatası -9800 serisinde bir kodla CFErrors olarak gösterilecektir. Bunlar Security / SecureTransport.h başlığında tanımlanır

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

CFNETWORK_DIAGNOSTICS

Konsol hakkında hata hakkında daha fazla bilgi almak için CFNETWORK_DIAGNOSTICS ortam değişkenini 1 olarak ayarlayın

nscurl

Araç, her bir ATS yapılandırması altında verilen ana bilgisayara güvenli bir bağlantı kurmayı deneyerek ve sonucu bildirerek birkaç farklı ATS istisna kombinasyonu üzerinden çalışacaktır.

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

1
Sadece nscurl sadece Mac OS X "El Capitan" da kullanılabilir
webo80

1
Sunucunuz tarafından hangi TLS bağlantı şifresinin kullanıldığını kontrol etmek için bir hata ayıklama ipucu daha: curl -v https: // <hostname>
André Morujão

1
PASS tüm adımları iyi kıvrılırsa soruna neyin yol açabileceği hakkında herhangi bir fikir var mı?
Aston

@ onmyway133 "CFNETWORK_DIAGNOSTICS ortam değişkenini 1'e nasıl ayarlayacağınız" konusunda açıklama ekleyebilirsiniz?
YakirNa

1
@YakirNa bunu nasıl yapacağınızı buradan okuyabilirsiniz nshipster.com/launch-arguments-and-environment-variables oldukça basit :)
onmyway133

2

Arka ucunuz güvenli bir bağlantı karınca kullanıyorsa NSURLSession'ı kullanırsınız

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

özellikle ATS sürümünü ve SSL sertifikası almak için sunucu yapılandırmanızı kontrol etmeniz gerekir:

Yalnızca ayarlayarak Güvenli Olmayan Bağlantıya İzin VermekNSExceptionAllowsInsecureHTTPLoads = YES yerine , sunucunuzun ATS (veya sunucu tarafını düzeltmek için daha iyi) için minimum gereksinimi (v1.2) karşılamaması durumunda Düşük Güvenliğe İzin Vermeniz gerekir .

Tek Bir Sunucuda Güvenliği Azaltmaya İzin Verme

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

sertifikayı araştırmak ve openssl istemcisini kullanarak sunucu yapılandırmanızı almak için openssl istemcisini kullanın:

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

.. sonunda bul

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)

Uygulama Aktarım Güvenliği (ATS), Aktarım Katmanı Güvenliği (TLS) protokolü sürüm 1.2 gerektirir.

ATS Kullanarak Bağlanma Gereksinimleri:

App Transport Güvenliği (ATS) kullanmak için bir web hizmeti bağlantısına ilişkin gereksinimler, sunucuyu, bağlantı şifrelerini ve sertifikaları aşağıdaki gibi içerir:

Sertifikalar aşağıdaki anahtar türlerinden biriyle imzalanmalıdır:

  • En az 256 (SHA-256 veya daha yüksek) özet uzunluğuna sahip Güvenli Karma Algoritma 2 (SHA-2) anahtarı

  • En az 256 bit boyutunda eliptik eğri şifreleme (ECC) anahtarı

  • En az 2048 bit uzunluğunda Rivest-Shamir-Adleman (RSA) anahtarı Geçersiz bir sertifika zor bir arızaya neden olur ve bağlantı olmaz.

Aşağıdaki bağlantı şifreleri ileri gizliliği (FS) destekler ve ATS ile çalışır:

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

Güncelleme: openssl'in yalnızca minimum protokol sürümünü sağladığı anlaşılıyor Protokol: TLSv1 bağlantıları


soru kalır, sunucunun gereksinimi karşılayıp karşılamadığını öğrenmek için openssl bilgilerini yorumlamak mümkün olmasıdır. Ayrıca Protokol: TLSv1, 1.x yerine yeni sürüm olabilir
Idali

Bağlantı noktasını kullanmak durumunda genel yapıyorum
Idali

Cevap, cevaplandığından daha fazla soruyu açık bırakır. Bir sorun, openssl raporları ile Apple belgeleri arasındaki eşlemeler olabilir. Openssl çıkışından TLS 1.2'nin desteklenip desteklenmediğini belirlemek mümkün değildir. Cevap ayrıca Mükemmel İletme Gizliliğinin desteklenip desteklenmediğini belirlemeye de izin vermez.
zaph

2

İki günlük deneme ve başarısızlıklardan sonra, benim için işe yarayan bu womble kodu

Bir değişiklikle, buna göre yazı biz ilişkili alt tuşlarını kullanarak durdurmak gerekir NSExceptionDomains Sözleşme'nin bu tür sözlüğe

  NSTemporaryExceptionMinimumTLSVersion

Ve yeni Sözleşmede kullanın

  NSExceptionMinimumTLSVersion

yerine.

apple belgeleri

kodum

<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

Başka bir yararlı araç nmap (brew install nmap)

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

Çıktı verir

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

sorununu ayıklamak için çok yararlı
Lopakhin

0

Bu hata, bazen bir hata / crashy Cordova iOS sürümü kullanırken günlüklerde ortaya çıkıyordu. Cordova iOS'u yükselttiğimde veya indirdiğimde gitti.

Bağlandığım sunucu TLSv1.2 SSL kullanıyordu, bu yüzden sorun olmadığını biliyordum.


0

Proje .plistdosyanıza şu izni ekleyin:

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

0

Info.plist yapılandırmasının sözdizimi

   <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

Güncellenmiş Yanıt (WWDC 2016 sonrası):

iOS uygulamaları 2016 sonuna kadar güvenli HTTPS bağlantıları gerektirecektir. ATS'yi kapatmayı denemek uygulamanızın gelecekte reddedilmesine neden olabilir.

App Transport Security veya ATS, Apple'ın iOS 9'da tanıttığı bir özelliktir. ATS etkinleştirildiğinde, uygulamayı güvenli olmayan HTTP yerine bir HTTPS bağlantısı üzerinden web hizmetlerine bağlanmaya zorlar.

Bununla birlikte, geliştiriciler yine de ATS'yi kapatabilir ve uygulamalarının yukarıdaki yanıtlarda belirtildiği gibi bir HTTP bağlantısı üzerinden veri göndermesine izin verebilir. 2016 yılının sonunda Apple, uygulamalarını App Store'a göndermeyi ümit eden tüm geliştiriciler için ATS'yi zorunlu hale getirecek . bağlantı


0

Test ettiğim cihazın yanlış zaman ayarı yapılmış. Bu yüzden yakında bitecek bir sertifika ile bir sayfaya erişmeye çalıştığımda, sertifikanın süresi dolmuş olsa da cihazın erişimi reddedilecekti. Düzeltmek için, cihazda uygun zamanı ayarlayın!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.