iOS9 "bir SSL hatası oluştu ve sunucuya güvenli bir bağlantı kurulamıyor" hatası alıyor


Yanıtlar:


123

İOS9 için Apple, App Transport Security'nin (ATS) bir parçası olarak iOS uygulamalarından tüm güvenli olmayan HTTP trafiğini devre dışı bırakarak iOS 9 ile radikal bir karar verdi .

ATS'yi basitçe devre dışı bırakmak için Info.plist'i açarak bu adımları takip edebilir ve aşağıdaki satırları ekleyebilirsiniz:

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

46
Yukarıdaki satırları plist'e ekledim, ancak hala şu hatayı alıyorum: Bir SSL hatası oluştu ve sunucuya güvenli bir bağlantı yapılamıyor. NSLocalizedRecoverySuggestion = Sunucuya yine de bağlanmak ister misiniz ?, _kCFNetworkCFStreamSSLErrorOriginalValue = -9819 HTTPS talebini arıyorum. HTTPS için başka bir seçenek var mı?
AiOsN

1
AiOsN = burada da aynı sorun, bir çözüm buldunuz mu?
Franck

5
NSAllowsArbitraryLoads'ın ATS'yi etkinleştirmek veya devre dışı bırakmak için bir anahtar olduğu yaygın bir yanlış yorum gibi görünüyor. Bir https: // isteği yaptığınızda, ATS gereksinimlerini karşıladığınızdan emin olmalısınız: sunucuda yüklü geçerli bir sertifika (joker karakter olmadan, sunucunun etki alanı adıyla tam olarak eşleşen), sunucu ileriye doğru TLS 1.2'yi destekler gizlilik.
Christian

@Christian Bu ATS gereksinimlerinin kaynağı nedir? Joker karakter sertifikalarını desteklememe konusunda hiçbir şey bulamıyorum.
Bart

@Bartosz Üzgünüz, sizi resmi bir belgeye yönlendiremem, bu sadece sunucu altyapımızı güncellerken gözlemlediğimiz bir şey.
Christian

64

Rasgele yüklemelere ( NSAllowsArbitraryLoads = true) izin vermek iyi bir çözüm olsa da , ATS'yi tamamen devre dışı bırakmamalı, bunun yerine izin vermek istediğiniz HTTP bağlantısını etkinleştirmelisiniz:

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

2
Tüm güvenlik sorunlarını görmezden gelmekten çok daha iyi. Amazon'un S3 hizmeti zayıf şifreleme kullanıyor ve doğrudan sunucularına yükleme yapmak sorunlara neden oluyordu, ancak bu sadece s3.amazonaws.com url'sini açmamızı ve geri kalanını yerinde tutmamızı sağladı. Harika!
mix3d

3
Ulaşmaya çalıştığım sunucu TLSv1.0 kullanıyordu. SLL hatasını atlamak için tls1.0 için NSExceptionMinimumTLSVersion eklemek zorunda kaldım
Ispas Claudiu

Bu cevap benim için çalıştı. Bir WKWebView kullanıyordum ve API sunucusuna bir SSL isteği göndermeye çalışıyordum.
Fan Jin

Merhaba @ Stéphane, garip bir durumla karşılaştım. Telefonumda iOS 12.1.2 sürümü var, ancak "Bir SSL hatası oluştu ve sunucuya güvenli bağlantı yapılamıyor" hatası alıyorum. Yaptığım şey plist dosyamı güncelledi. Uygulama iyi çalışıyor ve yine info.plist'te yaptığım değişiklikleri kaldırdım. Şimdi iyi çalışıyor. Bu nedenle, bu hatanın gerçek nedenini bulamıyorum. Herhangi bir öneri?
Mansuu ....

@Mansuu .... TLSv1.0'ı yukarıdaki yorumlarda önerildiği gibi kullanmayı denediniz mi?
Stéphane Bruckert

15

iOS 9, son güvenlik açıklarından kaçınmak için HTTPS kullanan bağlantıları TLS 1.2 olmaya zorlar. İOS 8'de şifrelenmemiş HTTP bağlantıları bile destekleniyordu, böylece TLS'nin eski sürümleri de herhangi bir sorun çıkarmadı. Geçici bir çözüm olarak, bu kod parçacığını Info.plist'inize ekleyebilirsiniz:

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

* App Transport Security'ye (ATS) başvurulur

görüntü açıklamasını buraya girin


1
Swift 4+ için, Uygulama Taşıma Güvenlik Ayarları -> Keyfi Yüklemelere İzin Ver = EVET
mehdigriche

14

Yalnızca belirli alanları hedefliyorsanız, bunu deneyebilir ve uygulamanızın Info.plist'e ekleyebilirsiniz:

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

Bu benim için işe yaramadı. Evet, "example.com" için doğru alan adını koydum.
Alyoshak

1
Benim için çalışıyor. Örneği sadece "Keyfi Yüklere İzin Ver" ile yaptığımda çalışıyor ama durdurulduktan sonra. "NSExceptionRequiresForwardSecrecy" -> false ve "NSIncludesSubdomains" -> true anahtarını kullandığımda mükemmel çalışıyor. Çok teşekkürler!
linhadiretalipe

1
Bu benim için de çalıştı! Https bağlantısı kullanmama rağmen yine de sorunla karşılaştım. Şu anda 'NSExceptionRequiresForwardSecrecy' desteği bulunmamaktadır. Okuduğuma göre, bunu daha önce belirtmek gerekli değildi, ancak bunu şimdi de zorunlu hale getirmiş gibi görünüyorlar. Not: iOS 10.2.1 ile deniyordum
Vaibhav Misra

6

Görünüşe göre iOS 9.0.2, geçerli HTTPS uç noktalarına yönelik istekleri kesiyor. Şimdiki şüphem, SHA-256 sertifikaları gerektirmesi veya bu hatayla başarısız olması.

Yeniden üretmek için UIWebView'unuzu safari ile inceleyin ve rastgele bir HTTPS uç noktasına gitmeyi deneyin:

location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)

Şimdi google'a gitmeyi deneyin (tabii ki SHA-256 sertifikalarına sahipler):

location.href = "https://google.com"
// no problemo

Taşıma güvenliğine bir istisna eklemek (@ stéphane-bruckert'in yukarıdaki cevabında belirtildiği gibi) bunu düzeltmeye yarar. Ayrıca tamamen devre dışı bırakmanın NSAppTransportSecurityda işe yarayacağını varsayıyorum , ancak tamamen devre dışı bırakmanın uygulama incelemenizi tehlikeye atabileceğini okudum.

[DÜZENLE] Bağlandığım etki alanlarını NSExceptionDomainsdiktede sıralamanın, NSExceptionAllowsInsecureHTTPLoadstrue olarak ayarlıyken bile bu sorunu çözdüğünü buldum . : \


2

Sorun, sunucu tarafındaki SSL sertifikasıdır. Ya bir şey karışıyor ya da sertifika hizmetle eşleşmiyor. Örneğin, bir sitenin www.mydomain.com için bir SSL sertifikası varken kullandığınız hizmet myservice.mydomain.com üzerinde çalışıyorsa. Bu farklı bir makinedir.


Aynı ip adresinde (etki alanı ve sunucu) bazı
url'lerle


0

Xcode projesi -> info.plist'e gidin ve + Düğmesine tıklayın, ardından Ekle (Uygulama Taşıma Güvenlik Ayarları) Genişletin, Rasgele Yüklere İzin Ver, YES Ayarlayın. Teşekkürler


@AbdulYasin plistinizi kontrol edin ve hava değişikliklerinin güncellenip güncellenmediğini kontrol edin?
Shanmugasundharam

1
Bu "rahat" yanıt, bu geçici çözümle ilgili açıklamaları ve güvenlik risklerini tamamen göz ardı eder.
Manuel


0

Benim durumumda simülatörümde bu sorunla karşılaştım çünkü bilgisayarımın tarihi güncel tarihin gerisindeydi. Bu nedenle, SSL hatasıyla karşılaştığınızda bu durumu da kontrol edin.


0

Oynatma sırasında aşağıdaki hata mesajı alıyordum

finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>

Plist dosyasındaki istisna etki alanlarına girdi eklediğimden ve NSAllowsArbitraryLoads'in true olarak ayarlandığından ve hala bir hata görmeye başladığımdan emin oldum.

Sonra http ile değil, https ile URL oynadığımı fark ettim.

Video url'sini http olarak ayarladım ve sorun çözüldü.


0

Bu hatayı bazı şebeke aramaları için alıyordum, diğerleri için değil. Halka açık bir kablosuz ağa bağlandım. Bu ücretsiz wifi, belirli URL'lerle ve dolayısıyla hata ile oynanıyor gibi görünüyordu.

LTE'ye bağlandığımda bu hata ortadan kalktı!

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.