iOS9 wyświetla błąd „Wystąpił błąd SSL i nie można nawiązać bezpiecznego połączenia z serwerem”

Odpowiedzi:

123

W przypadku iOS9 Apple podjął radykalną decyzję z iOS 9, wyłączając cały niezabezpieczony ruch HTTP z aplikacji iOS, jako część App Transport Security (ATS) .

Aby po prostu wyłączyć ATS, możesz wykonać następujące kroki, otwierając Info.plist i dodać następujące wiersze:

<key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>
Tony TRAN
źródło
46
Dodałem powyższe wiersze w plist, ale nadal otrzymuję następujący błąd: Wystąpił błąd SSL i nie można nawiązać bezpiecznego połączenia z serwerem. NSLocalizedRecoverySuggestion = Czy mimo to chcesz połączyć się z serwerem ?, _kCFNetworkCFStreamSSLErrorOriginalValue = -9819 Wzywam żądanie HTTPS. Czy jest jakaś inna opcja dla HTTPS?
AiOsN
1
AiOsN = ten sam problem, czy znalazłeś rozwiązanie?
Franck,
5
Wydaje się, że jest to powszechna błędna interpretacja, że ​​NSAllowsArbitraryLoads jest przełącznikiem włączającym lub wyłączającym ATS. Jak tylko wykonasz żądanie https: //, musisz upewnić się, że spełniasz wymagania ATS: ważny certyfikat zainstalowany na serwerze (bez symbolu wieloznacznego, dokładnie pasujący do nazwy domeny serwera), serwer obsługuje TLS 1.2 z przekazywaniem tajność.
Christian
@Christian Jakie jest źródło tych wymagań ATS? Nie mogę znaleźć nic o nieobsługiwaniu certyfikatów wieloznacznych.
Bart
@Bartosz Przepraszamy, nie mogę wskazać oficjalnego dokumentu, to tylko coś, co zaobserwowaliśmy podczas aktualizacji naszej infrastruktury serwerowej.
Christian
64

Mimo że zezwolenie na dowolne ładowanie ( NSAllowsArbitraryLoads = true) jest dobrym obejściem, nie należy całkowicie wyłączać ATS, ale raczej włączyć połączenie HTTP, na które chcesz zezwolić:

<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>
Stéphane Bruckert
źródło
2
O wiele lepsze niż ignorowanie wszystkich problemów związanych z bezpieczeństwem. Usługa Amazon S3 używa słabego szyfrowania, a ładowanie bezpośrednio na ich serwery powodowało problemy, ale to pozwoliło nam otworzyć tylko adres URL s3.amazonaws.com, pozostawiając resztę w linii. Niesamowite!
mix3d
3
Serwer, do którego próbowałem się dostać, korzystał z protokołu TLSv1.0. Musiałem dodać NSExceptionMinimumTLSVersion dla tls1.0, aby ominąć błąd SLL
Ispas Claudiu
Ta odpowiedź zadziałała dla mnie. Używałem WKWebView i próbowałem wysłać żądanie SSL do serwera API.
Fan Jin
Cześć @ Stéphane, mam dziwną sytuację. Mój telefon ma iOS w wersji 12.1.2, ale wyświetla mi się błąd „Wystąpił błąd SSL i nie można nawiązać bezpiecznego połączenia z serwerem”. To, co zrobiłem, to zaktualizowanie mojego pliku plist. Aplikacja działa dobrze i ponownie usunąłem zmiany, które wprowadziłem w info.plist. Teraz działa dobrze. Nie jestem więc w stanie znaleźć rzeczywistej przyczyny tego błędu. Jakieś sugestie?
Mansuu ....
@Mansuu .... czy próbowałeś użyć TLSv1.0, jak zasugerowano w komentarzach powyżej?
Stéphane Bruckert
15

iOS 9 wymusza na połączeniach używających HTTPS TLS 1.2, aby uniknąć ostatnich luk w zabezpieczeniach. W iOS 8 obsługiwane były nawet nieszyfrowane połączenia HTTP, więc starsze wersje TLS również nie sprawiały problemów. Aby obejść ten problem, możesz dodać ten fragment kodu do swojej Info.plist:

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

* w odniesieniu do App Transport Security (ATS)

wprowadź opis obrazu tutaj

TechSeeko
źródło
1
Dla Swift 4+, ustawienia zabezpieczeń transportu aplikacji -> Zezwalaj na dowolne obciążenia = TAK
mehdigriche
14

Jeśli kierujesz tylko reklamy na określone domeny, możesz spróbować dodać to w Info.plist swojej aplikacji:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
Nathan Noble
źródło
To nie zadziałało dla mnie. Tak, wstawiłem poprawną domenę dla „example.com”.
Alyoshak
1
To dla mnie praca. kiedy zrobiłem przykład tylko z "Allow Arbitrary Loads" działa ale po zatrzymaniu. Kiedy użyłem klucza „NSExceptionRequiresForwardSecrecy” -> false i „NSIncludesSubdomains” -> true, działa idealnie. Wielkie dzięki!
linhadiretalipe
1
U mnie też to zadziałało! Mimo że używam połączenia https, nadal napotykam problem. Obecnie nie ma wsparcia dla „NSExceptionRequiresForwardSecrecy”. Z tego, co przeczytałem, nie trzeba było tego wcześniej określać, ale wygląda na to, że teraz również to stało się obowiązkowe. PS: Próbowałem z iOS 10.2.1
Vaibhav Misra
6

Wygląda na to, że iOS 9.0.2 przerywa żądania do prawidłowych punktów końcowych HTTPS. Moje obecne podejrzenie jest takie, że wymaga certyfikatów SHA-256 lub nie powiedzie się z tym błędem.

Aby odtworzyć, sprawdź swój UIWebView za pomocą safari i spróbuj przejść do dowolnego punktu końcowego HTTPS:

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)

Teraz spróbuj przejść do Google (ponieważ mają oczywiście certyfikat SHA-256):

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

Dodanie wyjątku do bezpieczeństwa transportu (zgodnie z powyższą odpowiedzią @ stéphane-bruckert) działa, aby to naprawić. Zakładam też, że całkowicie wyłączamNSAppTransportSecurity by działało, chociaż przeczytałem, że całkowite wyłączenie może zagrozić twojej recenzji aplikacji.

[EDYTUJ] Zauważyłem, że zwykłe wyliczenie domen, z którymi się NSExceptionDomainsłączę w dyktandzie, rozwiązuje ten problem, nawet jeśli pozostawiam NSExceptionAllowsInsecureHTTPLoadswartość true. : \

steve
źródło
2

Problemem jest certyfikat ssl po stronie serwera. Albo coś przeszkadza, albo certyfikat nie pasuje do usługi. Na przykład, gdy witryna ma certyfikat ssl dla www.moja_domena.com, podczas gdy używana usługa działa pod adresem myservice.mydomain.com. To inna maszyna.

Helge Becker
źródło
Mam problem z niektórymi adresami URL, ale nie z innymi pod tym samym adresem IP (domena i serwer)
user6631314
0

Projekt Xcode -> goto info.plist i kliknij przycisk +, a następnie Dodaj (ustawienia zabezpieczeń transportu aplikacji) Rozwiń, Zezwalaj na dowolne obciążenia ustawione na TAK. Dzięki

Shanmugasundharam
źródło
@AbdulYasin sprawdzić swój plist i sprawdzić, czy zmiany pogody są aktualizowane, czy nie?
Shanmugasundharam
1
Ta „wyluzowana” odpowiedź całkowicie pomija wyjaśnienie i zagrożenia bezpieczeństwa związane z tym obejściem.
Manuel
0

W moim przypadku napotkałem ten problem w moim symulatorze, ponieważ data mojego komputera była spóźniona. Więc sprawdź ten przypadek, gdy napotkasz błąd SSL.

Teena nath Paul
źródło
0

Podczas odtwarzania pojawiał się błąd poniżej

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>

Upewniłem się, że dodałem wpis w domenach wyjątków w pliku plist, a NSAllowsArbitraryLoads jest ustawione na true i nadal widzę błąd.

Wtedy zdałem sobie sprawę, że gram w URL z https a nie http.

Ustawiłem adres URL filmu na http i problem został rozwiązany.

Naren
źródło
0

Otrzymywałem ten błąd w przypadku niektórych połączeń sieciowych, a innych nie. Byłem podłączony do publicznego Wi-Fi. Wydawało się, że darmowe Wi-Fi manipuluje niektórymi adresami URL i stąd błąd.

Po podłączeniu do LTE ten błąd zniknął!

kochanie
źródło