Bezpieczeństwo transportu zablokowało jawny tekst HTTP


1451

Jakie ustawienia muszę wprowadzić, info.plistaby włączyć tryb HTTP zgodnie z poniższym komunikatem o błędzie?

Bezpieczeństwo transportu zablokowało ładowanie zasobu HTTP w postaci jawnego tekstu (http: //), ponieważ jest ono niepewne. Tymczasowe wyjątki można skonfigurować za pomocą pliku Info.plist aplikacji.

Xcode

Załóżmy, że moja domena to example.com.



15
Uwaga moderatora : Istnieje już 36 odpowiedzi na to pytanie. Przed dodaniem kolejnego upewnij się, że Twoje rozwiązanie jest nowe .
Matt

5
UWAGA: Rozwiązania tutaj sugerują, że należy wyłączyć ATS ( Allow arbitary loads). Wkrótce nie będzie to możliwe, ponieważ Apple będzie wymagało ATS (pierwotnie koniec roku - termin został przedłużony) - developer.apple.com/news/?id=12212016b
Jakub Truhlář


@Jeef, dlaczego dodałeś tag iOS 10? czy były jakieś dodatkowe zmiany w iOS 10 w tej kwestii? Wydaje mi się, że został wprowadzony w iOS9 i ten tag powinien wystarczyć dla wersji iOS
Julian Król

Odpowiedzi:


468

Jeśli używasz Xcode 8.0+ i Swift 2.2+ lub nawet Cel C:

Wpisz opis zdjęcia tutaj

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

29
Dlaczego jest NSAllowsArbitraryLoadsustawiony na true? Obniżasz cel ATS. Zobacz także Najbardziej niebezpieczny kod na świecie: sprawdzanie poprawności certyfikatów SSL w oprogramowaniu innym niż przeglądarka . Twoje oprogramowanie właśnie znalazło się na liście.
jww

6
@jww To jest cel tego postu. Witryna, z którą muszę się połączyć, aby odtwarzać dźwięk, jeszcze nie używa HTTPS i nie próbuję czekać.
ThinkDigital

5
To nie będzie działać w iOS 10.0+ lub MacOS 10.12+ Mówi to, że zezwala na wszystkie dowolne ładunki Z WYJĄTKIEM wymienionych (przykład.com). W ten sposób zrobiłoby to odwrotność tego, co jest pożądane. NSAllowsArbirtraryLoads należy tutaj ustawić na false. więcej informacji: Dokumenty Apple
Freek Sanders

1
Zgadzam się, dlaczego, u licha, wszyscy to popierają? nie ma sensu używać NSAllowsArbitraryLoads, jeśli ustawisz domenę wyjątków.
thibaut noah

1
NSAllowsArbitraryLoads nie musi być prawdą, więc należy go usunąć. Wystarczy NSExceptionDomains, który umożliwia niezabezpieczone połączenie tylko z tą domeną. NSAllowsArbitraryLoads = true umożliwi niezabezpieczone połączenie z dowolną domeną, więc jeśli nadal będzie ustawione na true, to bzdury NSExceptionDomains mają, ponieważ obejmują już wszystkie domeny
mister_giga

950

Użyj NSAppTransportSecurity:

Wpisz opis zdjęcia tutaj

Trzeba ustawić NSAllowsArbitraryLoads klucz TAK pod NSAppTransportSecurity słownika w pliku Info.plist.

Konfiguracja Plist


157
Niech będzie wiadomo: TO OBEJŚCIE! Za każdym razem, gdy używasz protokołu HTTP przez HTTPS, narażasz urządzenia użytkownika na podatność na zagrożenia. Oczywiście w wielu przypadkach jest to mało prawdopodobne, ale programowanie etyczne jest najlepszą praktyką. Po prostu mówię ... - także +1 za pracę (dla celów testowych)
Jacksonkr

36
To NIE jest rozwiązanie - to HACK! Aby dodać „wyjątki” dla poszczególnych domen, zapoznaj się z odpowiedzią poniżej: stackoverflow.com/a/32560433/1103584
DiscDev

17
Chociaż wiadomo, że to rozwiązanie jest podatne na ataki, jest to jedyne rozwiązanie, które poleciłbym podczas ROZWOJU . Konieczność wpisywania każdej dokładnej domeny podczas programowania jest po prostu głupia (szczególnie jeśli korzystasz z usług internetowych stron trzecich).
reTs

6
Nazwa tych kluczy zmieniła się teraz „Ustawienia zabezpieczeń transportu aplikacji” pod tym „Zezwól na dowolne
ładunki

11
Dlaczego tak wielu ludzi sprzeciwia się takiemu rozwiązaniu? To zdecydowanie NIE jest hack! Wiele aplikacji musi komunikować się z internetem, gdzie protokół bezpieczeństwa nie zawsze jest pod twoją kontrolą. Na przykład wydaje się bardzo rozsądne, aby móc wyświetlać obrazy z innych serwerów, które nie mają certyfikatu SSL.
Oren,

825

Oto ustawienia wizualnie:

ustawienia wizualne dla NSAllowsArbitraryLoads w info.plist poprzez GUI Xcode


10
Nie mam tej opcji.
Użytkownik

25
Jeśli otworzysz bezpośrednio swoją Info.plist, możesz po prostu dodać słownik NSAppTransportSecurity , a następnie utworzyć w nim element NSAllowsArbitraryLoads (patrz odpowiedź pod redakcją Umar Farooq poniżej).
Stoph

3
To samo tutaj - domeny wyjątków nie działały dla mnie z 7.3.
RegularExpression

4
Ta opcja nie istnieje - XCode 7.3.1
jameshfisher

3
Informacje z @JoshPinter pracowały dla mnie przy XCode 8.
Matthew Bellantoni

717

Zobacz post na forum Bezpieczeństwo transportu aplikacji? .

Również strona Konfigurowanie wyjątków bezpieczeństwa transportu aplikacji w iOS 9 i OSX 10.11 .

Na przykład możesz dodać określoną domenę, taką jak:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>example.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>

Leniwa opcja to:

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

Uwaga:

info.plist jest plikiem XML, więc możesz umieścić ten kod mniej więcej w dowolnym miejscu w pliku.


1
Jak mogę to zrobić, to znaczy w jaki sposób dodać ten kod do Info.plist, ponieważ nie wiem, gdzie wkleić ten kod?
lmiguelvargasf

2
@lmiguelvargasf otwórz swój info.plist w zwykłym edytorze tekstu
Dan Beaulieu

7
Nadal pojawia się błąd: domena wyjątku jest ustawiona, a NSAllowsArbitraryLoads ma wartość false. Nawet przy ustawionej wartości NSAllowsArbitraryLoads pojawia się błąd. Czy ktoś jeszcze ma ten problem?
klaevv

3
Począwszy od 1/30/2016 firmy Apple pokazuje doc, że klucze nie mają już tymczasowe słowo w nich, np NSExceptionAllowsInsecureHTTPLoads NSExceptionMinimumTLSVersion See developer.apple.com/library/prerelease/ios/documentation/...
Philippe Monnet

3
W przypadku, gdy ktoś inny wyciąga włosy, ponieważ te proste zmiany w info.plist nie działają. Dodaj zmiany do Projekt> Cel> Informacje> Niestandardowe właściwości celu iOS
BlueGuy

330

Zostało to przetestowane i działało na ziarnie iOS 9 GM - jest to konfiguracja umożliwiająca określonej domenie używanie HTTP zamiast HTTPS:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSAllowsArbitraryLoads</key> 
      <false/>
       <key>NSExceptionDomains</key>
       <dict>
            <key>example.com</key> <!--Include your domain at this line -->
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
       </dict>
</dict>

NSAllowsArbitraryLoadsmusi być false, ponieważ uniemożliwia wszelkie niebezpieczne połączenia, ale lista wyjątków umożliwia połączenie z niektórymi domenami bez HTTPS.


7
TO powinno być oznaczone jako odpowiedź. Przetestowane i działające na ziarnie iOS 9 GM, aby umożliwić określonej domenie korzystanie z http bez „leniwego” sposobu i całkowitego otwarcia aplikacji.
DiscDev,

2
Jak dodać to do mojej info.plist?
JMStudios.jrichardson

8
Ok, dodałem ten wpis do mojej info.plist i wciąż pojawia się ten błąd - „App Transport Security zablokował ładowanie zasobu HTTP w postaci jawnego tekstu (http: //), ponieważ jest niepewny. Tymczasowe wyjątki można skonfigurować za pomocą informacji o aplikacji plik .plist. ”
KMC

2
@RomanShapovalov, jeśli musisz użyć adresu IP, spróbuj dodać .xip.io na końcu adresu IP i dodaj xip.io do NSExceptionDomains. Zobacz xip.io . Podczas programowania (ale nie wydania) łączę się bezpośrednio z adresem IP i działa to dla mnie świetnie.
tpankake

2
Nie działało dla mnie, dopóki nie zdałem sobie sprawy, że umieściłem go w niewłaściwym info.plist w moim projekcie testowym. Upewnij się, że umieściłeś go we właściwym!
Chucky

144

Jest to szybkie obejście (ale nie zalecane), aby dodać to do listy:

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

Co oznacza (zgodnie z dokumentacją Apple ):

NSAllowsArbitraryLoads
Wartość logiczna używana do wyłączania bezpieczeństwa transportu aplikacji dla domen niewymienionych w słowniku NSExceptionDomains. Domeny z listy używają ustawień określonych dla tej domeny.

Domyślna wartość NIE wymaga domyślnego zachowania App Transport Security dla wszystkich połączeń.

Naprawdę polecam linki:

które pomagają mi zrozumieć przyczyny i wszystkie implikacje.

Poniższy plik XML (w pliku Info.plist):

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

nie zezwalaj na arbitralne połączenia dla wszystkich stron, ale dla PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDEzezwoli na to, aby połączenia korzystały z protokołu HTTP.

Do powyższego kodu XML możesz dodać:

<key>NSIncludesSubdomains</key>
<true/>

jeśli chcesz zezwolić na niebezpieczne połączenia z poddomenami podanego adresu.

Najlepszym rozwiązaniem jest zablokowanie wszystkich dowolnych ładowań (ustawionych na wartość false) i dodanie wyjątków, aby zezwolić tylko na adresy, o których wiemy, że są w porządku.

Dla zainteresowanych czytelników

Aktualizacja 2018:

Apple nie zaleca wyłączania tego - więcej informacji można znaleźć w 207 sesji WWDC 2018 z dodatkowymi wyjaśnieniami dotyczącymi bezpieczeństwa

Pozostawiając oryginalną odpowiedź ze względów historycznych i fazy rozwoju


1
NSAllowsArbitraryLoadsmusi byćfalse
Sound Blaster

@SoundBlaster w jakim przypadku i co widzisz źle w mojej odpowiedzi na głosowanie w dół?
Julian Król

dodając plist (NSAppTransportSecurity NSAllowsArbitraryLoads), wszystkie usługi sieciowe działają dobrze, z wyjątkiem jednej usługi internetowej jedna usługa internetowa zwraca błąd wewnętrzny serwera (500) w iOS 9, ale działa dobrze w iOS8 lub nowszym
amit gupta

@SoundBlaster dokonał zmiany, teraz nie powinieneś mieć zastrzeżeń :)
Julian Król

Dzięki, jak to właściwie dodać <key>NSIncludesSubdomains</key> <true/>? Czy każde otoczenie musi być otoczone <dict>? jak edytujesz ten cholerny plik plist? Jakie jest formatowanie? : D Dziękuję.
Agentka Zebra,

116

Dla tych z Was, którzy chcą więcej informacji na temat tego, dlaczego tak się dzieje, oprócz tego, jak to naprawić, przeczytaj poniżej.

Wraz z wprowadzeniem systemu iOS 9, aby poprawić bezpieczeństwo połączeń między aplikacją a usługami internetowymi, bezpieczne połączenia między aplikacją a usługą internetową muszą być zgodne z najlepszymi praktykami . Zachowanie najlepszych praktyk jest egzekwowane przez App Transport Security w celu:

  • zapobiegać przypadkowemu ujawnieniu, oraz
  • zapewnić bezpieczne zachowanie domyślne.

Jak wyjaśniono w notatce technicznej App Transport Security , podczas komunikacji z usługą internetową App Transport Security ma teraz następujące wymagania i zachowanie:

  • Serwer musi obsługiwać co najmniej protokół Transport Layer Security (TLS) w wersji 1.2.
  • Szyfry połączeń są ograniczone do tych, które zapewniają poufność przekazywania (patrz lista szyfrów poniżej).
  • Certyfikaty muszą być podpisane przy użyciu algorytmu skrótu podpisu SHA256 lub lepszego, za pomocą klucza RSA o długości 2048 bitów lub większej albo klucza o krzywej eliptycznej (ECC) o długości 256 bitów lub większej.
  • Nieprawidłowe certyfikaty powodują ciężką awarię i brak połączenia.

Innymi słowy, twoje żądanie usługi internetowej powinno: a.) Używać HTTPS i b.) Być szyfrowane przy użyciu TLS v1.2 z zachowaniem tajemnicy przekazywania.

Jednak, jak wspomniano w innych postach, możesz zastąpić to nowe zachowanie z App Transport Security, określając niepewną domenę w Info.plistswojej aplikacji.


Aby zastąpić, musisz dodać NSAppTransportSecurity> NSExceptionDomainswłaściwości słownika do swojego Info.plist. Następnie dodasz domenę usługi internetowej do NSExceptionDomainssłownika.

Na przykład, jeśli chcę ominąć zachowanie App Transport Security dla usługi internetowej na hoście www.twojawebservicehost.com, to zrobiłbym następujące:

  1. Otwórz aplikację w Xcode.

  2. Znajdź Info.plistplik w Nawigatorze projektu i kliknij go prawym przyciskiem myszy i wybierz opcję menu Otwórz jako > Kod źródłowy . Plik listy właściwości pojawi się w prawym okienku.

  3. Umieść następujący blok właściwości w głównym słowniku właściwości (pod pierwszym <dict>).


<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Jeśli musisz podać wyjątki dla dodatkowych domen, możesz dodać inną właściwość słownika poniżej NSExceptionDomains.

Aby dowiedzieć się więcej na temat wyżej wymienionych kluczy, przeczytaj wspomnianą już notę ​​techniczną .


1
To działało w 2 moich aplikacjach, ale nie działa na trzeciej. Czy ktoś jeszcze napotkał sytuację, w której użyto powyższej poprawki i nadal pojawia się ten sam komunikat o błędzie? (i tak zaktualizowałem słownik, aby używał mojej domeny API, a nie tej w kodzie)
helloB

Najlepsza ! Apple potwierdza, że ​​to rozwiązanie używa
YannSteph

Działa to w przypadku pliku edycji aplikacji Cordova / Phonegap / Ionic ./platforms/ios/<project>/<project>-Info.plistz NSAllowsArbitraryLoads=falsewieloma domenami wyjątków dla usług o różnych kombinacjach TLS / HTTP / HTTPS. Początkowo używany, NSAllowsArbitraryLoads=truea następnie dostosowywany, rozwiązywanie problemów z regułami metodą prób i błędów w celu zapewnienia zgodności z wytycznymi i przedstawienia do zatwierdzenia. Uwaga: config.xml <access origin=.../>instrukcje częściowo wypełniają ten plik, ale obecnie wymagają korekty poprzez bezpośrednią edycję lub za pomocą XCode, aby uzyskać poprawność szczegółów.
styczeń

Również <access origin="*"/>(w config.xml) zestawy NSAllowsArbitraryLoads=true(dla aplikacji Cordova / Phonegap / hybrid
Jimmont

Dlaczego jest NSExceptionAllowsInsecureHTTPLoadsustawiony na true? Obniżasz cel ATS. Zobacz także Najbardziej niebezpieczny kod na świecie: sprawdzanie poprawności certyfikatów SSL w oprogramowaniu innym niż przeglądarka . Twoje oprogramowanie właśnie znalazło się na liście.
jww

67

Nie lubię bezpośrednio edytować listy. Możesz łatwo dodać go do listy za pomocą GUI:

  • Kliknij Info.plist w Nawigatorze po lewej stronie.
  • Teraz zmień dane w głównym obszarze:

    • W ostatnim wierszu dodaj znak +
    • Wprowadź nazwę grupy: Ustawienia zabezpieczeń transportu aplikacji
    • Kliknij grupę prawym przyciskiem myszy i wybierz Add Row
    • Wprowadź Zezwól na dowolne obciążenia
    • Ustaw wartość po prawej stronie na TAK

Przykład


Wyjaśnienie: jeśli „Zezwól na dowolne obciążenia” to TAK i istnieją „Domeny wyjątków”, wówczas dozwolone obciążenia są ograniczone do tych w Domenach wyjątków. Czy to jest poprawne?

czy to bezpieczny sposób, aby to zrobić, jeśli chcę zwolnić aplikację?
Lamour

Nie. Umożliwiając dowolne ładowanie, aplikacja może swobodnie łączyć się z dowolnymi domenami. Z punktu widzenia bezpieczeństwa należy kontrolować i ograniczać domenę / witrynę, z którą ma się łączyć aplikacja, aby uniknąć nieoczekiwanego użycia sieci.
Raptor

Większość aplikacji kieruje tylko do znanych serwerów. Jest to kontrolowane przez programistę. Problemy bezpieczeństwa są znane.
Vincent

Dlaczego jest NSAllowsArbitraryLoadsustawiony na YES? Obniżasz cel ATS. Zobacz także Najbardziej niebezpieczny kod na świecie: sprawdzanie poprawności certyfikatów SSL w oprogramowaniu innym niż przeglądarka . Twoje oprogramowanie właśnie znalazło się na liście.
jww

25

Dokument Apple 1

Dokument Apple 2

Istnieją na to dwa rozwiązania:

Rozwiązania 1:

  1. W Info.plistpliku dodaj słownik z kluczem ' NSAppTransportSecurity'
  2. Dodaj kolejny element do słownika za pomocą klucza 'Allow Arbitrary Loads'

Plist struktura powinna wyglądać jak pokazano na poniższym obrazku.

Rozwiązanie 1

Rozwiązanie 2:

  1. W Info.plistpliku dodaj słownik z kluczem ' NSAppTransportSecurity'
  2. Dodaj kolejny element do słownika za pomocą klucza ' NSExceptionDomains'
  3. Dodaj element za pomocą klucza 'MyDomainName.com'typu NSDictionary
  4. Dodaj element z kluczem „ NSIncludesSubdomains” typu Booleani wartości ustawionym jakoYES
  5. Dodaj element z kluczem „ NSTemporaryExceptionAllowsInsecureHTTPLoads” typu Booleani wartości ustawionym jakoYES

Plist struktura powinna wyglądać jak pokazano na poniższym obrazku.

Rozwiązanie 2

Preferowane jest rozwiązanie 2, ponieważ pozwala ono tylko na wybraną domenę, podczas gdy rozwiązanie 1 pozwala na wszystkie niepewne połączenia HTTP.


Dlaczego jest NSAllowsArbitraryLoadsustawiony na YES? Obniżasz cel ATS. Zobacz także Najbardziej niebezpieczny kod na świecie: sprawdzanie poprawności certyfikatów SSL w oprogramowaniu innym niż przeglądarka . Twoje oprogramowanie właśnie znalazło się na liście.
jww

20

Zabezpieczenia transportu są dostępne w systemie iOS 9.0 lub nowszym. Możesz mieć to ostrzeżenie, gdy próbujesz wywołać WS w swojej aplikacji:

Aplikacja Transport Transport Security zablokowała ładowanie zasobu czystego tekstu HTTP (http: //), ponieważ jest niepewna. Tymczasowe wyjątki można skonfigurować za pomocą pliku Info.plist aplikacji.

Dodanie następujących informacji do Info.plist wyłączy ATS:

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

1
NSAllowsArbitraryLoads musi być fałszywy, jeśli true, pozwala na wszystkie niebezpieczne połączenia
Thiago Arreguy,

dodając do listy wszystkie usługi sieciowe działające poprawnie, z wyjątkiem jednej usługi internetowej, jedna usługa internetowa zwraca błąd wewnętrznego serwera (500) w iOS 9, ale działa dobrze w iOS8 lub nowszym
amit gupta

1
Zaakceptowano w sklepie?
Vrashabh Irde

Bardzo zła rada; zobacz Najbardziej niebezpieczny kod na świecie: sprawdzanie poprawności certyfikatów SSL w oprogramowaniu innym niż przeglądarka . Biorąc pod uwagę pytanie, czy pełen zalecanego sposobu robienia rzeczy, odpowiedzi „ja też” nie są potrzebne.
jww

15

Przykład rozwoju

Oto zrzut ekranu plista, który utrzymuje ATS w stanie nienaruszonym (= bezpieczny), ale pozwala na nawiązywanie połączeń z hostem lokalnym przez HTTP zamiast HTTPS . Działa w Xcode 7.1.1.

Wpisz opis zdjęcia tutaj


Czy są jakieś sposoby, aby zabezpieczyć localhost, np. Za pomocą HTTPS, w native-native, abyśmy nie musieli używać domyślnej NSExceptionAllowsInsecureHTTPLoads - YESkonfiguracji?
milkersarac,

13

Przejdź do swojej Info.plist

  1. Kliknij prawym przyciskiem myszy puste miejsce i kliknij opcję Dodaj wiersz
  2. Pod nazwą klucza wpisz NSAppTransportSecurity
  3. Wybierz Domeny wyjątków, Dodaj nowy element do tego
  4. Zapisz nazwę domeny, do której chcesz uzyskać dostęp
  5. Zmień typ domeny z String na Dictionary, dodaj nowy element
  6. NSTemporaryExceptionAllowsInsecureHTTPLoads, który będzie wartością logiczną o prawdziwej wartości. Spójrz na zdjęcie, aby postępować zgodnie z nim

1
Dlaczego jest NSAllowsArbitraryLoadsustawiony na true? Obniżasz cel ATS. Zobacz także Najbardziej niebezpieczny kod na świecie: sprawdzanie poprawności certyfikatów SSL w oprogramowaniu innym niż przeglądarka . Twoje oprogramowanie właśnie znalazło się na liście.
jww

13

Według Apple, wyłączenie ATS spowoduje odrzucenie aplikacji, chyba że masz ku temu dobry powód. Nawet wtedy należy dodać wyjątki dla domen, do których można bezpiecznie uzyskać dostęp.

Apple ma doskonałe narzędzie, które mówi dokładnie, jakich ustawień użyć: W Terminalu wpisz

/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever

a nscurl sprawdzi, czy to żądanie się nie powiedzie, a następnie wypróbuje różne ustawienia i powie dokładnie, które z nich przechodzi i co zrobić. Na przykład dla niektórych adresów URL stron trzecich, które odwiedzam, to polecenie powiedziało mi, że ten słownik przechodzi:

{
    NSExceptionDomains = {
        "www.example.com" = {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}

Aby rozróżnić między własnymi witrynami a witrynami stron trzecich, które są poza Twoją kontrolą, użyj na przykład klucza NSThirdPartyExceptionRequiresForwardSecrecy.


1
jego świetne narzędzie do sprawdzenia przed testowaniem aplikacji. Oszczędzaj czas. ale wszelkie zasoby do przeczytania, aby zrozumieć działanie tego polecenia.
damithH

1
Ciekawe narzędzie. W moim przypadku to przecenia. Wymienia trzy klucze, w tym NSExceptionAllowsInsecureHTTPLoads = true;, ale okazuje się, że jeden nie jest potrzebny.
Chris Prince

11

Ustalenie, jakich ustawień można użyć automatycznie, jak wspomniano w tej notce technicznej :

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com

Najwyraźniej potrzebujesz do tego OS X 10.11 (El Capitan).
ecotax

10

UWAGA: Domena wyjątków na liście musi znajdować się w DOLNEJ PRZYPADKU.

Przykład: nazwałeś swój komputer „MyAwesomeMacbook” w Ustawieniach-> Udostępnianie; Twój serwer (do celów testowych) działa na MyAwesomeMacbook.local: 3000, a twoja aplikacja musi wysłać żądanie na http: //MyAwesomeMacbook.local: 3000 / pliki ..., twój list będzie musiał określić „myawesomemacbook. lokalny ”jako domena wyjątku.

-

Twój info.plist zawierałby ...

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>myawesomemacbook.local</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>

9

Posługiwać się:

Zrzut ekranu PList, aby lepiej zrozumieć

Dodaj nowy element, NSAppTransportSecurity , w pliku plist z typem Dictionary , a następnie dodaj element podrzędny NSAllowsArbitraryLoads w słowniku typu Boolean i ustaw wartość bool na TAK . To działa dla mnie.


1
NSAllowsArbitraryLoads musi być fałszywy, jeśli true, pozwala na wszystkie niebezpieczne połączenia
Thiago Arreguy

dodając do listy wszystkie usługi sieciowe działające poprawnie, z wyjątkiem jednej usługi internetowej, jedna usługa internetowa zwraca błąd wewnętrznego serwera (500) w iOS 9, ale działa dobrze w iOS8 lub nowszym @ThiagoArreguy
gupta

Bardzo zła rada; zobacz Najbardziej niebezpieczny kod na świecie: sprawdzanie poprawności certyfikatów SSL w oprogramowaniu innym niż przeglądarka . Biorąc pod uwagę pytanie, czy pełen zalecanego sposobu robienia rzeczy, odpowiedzi „ja też” nie są potrzebne.
jww

Wiem, że to zła rada, ale na razie jest to tylko rozwiązanie w trybie programowania. Apple zapewniło nam elastyczność, jeśli byłoby tak źle, nie pozwoliliby na to.
Tejinder

9

25.09.2015 (po aktualizacji Xcode 18.09.2015):

Użyłem nie leniwej metody, ale to nie zadziałało. Oto moje próby.

Pierwszy,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

I drugi,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Wreszcie użyłem leniwej metody:

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

Może to być trochę niepewne, ale nie mogłem znaleźć innych rozwiązań.


Dlaczego jest NSAllowsArbitraryLoadsustawiony na true? Obniżasz cel ATS. Zobacz także Najbardziej niebezpieczny kod na świecie: sprawdzanie poprawności certyfikatów SSL w oprogramowaniu innym niż przeglądarka . Twoje oprogramowanie właśnie znalazło się na liście.
jww

9

W swift 4 i xocde 10 jest zmiana NSAllowsArbitraryLoads na Allow Arbitrary Load. będzie to wyglądać tak:

<key>App Transport Security Settings</key>
<dict>
     <key>Allow Arbitrary Loads</key><true/>
</dict>

6

Warto wspomnieć, jak się tam dostać ...

Info.plist to jeden z plików poniżej Main.storyboard lub viewController.swift.

Kiedy klikniesz go po raz pierwszy, zwykle ma on format tabeli, więc kliknij plik prawym przyciskiem myszy i „otwórz jako” kod źródłowy, a następnie dodaj kod pod koniec, tj .:

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

Skopiuj wklej kod powyżej

 "</dict>
</plist>"

który jest na końcu.


Dlaczego jest NSAllowsArbitraryLoadsustawiony na true? Obniżasz cel ATS. Zobacz także Najbardziej niebezpieczny kod na świecie: sprawdzanie poprawności certyfikatów SSL w oprogramowaniu innym niż przeglądarka . Twoje oprogramowanie właśnie znalazło się na liście.
jww

5

Aktualizacja Xcode 7.1, problem 27.10.15:

Nowa wartość w Info.plist to „Ustawienia zabezpieczeń transportu aplikacji”. Stamtąd ten słownik powinien zawierać:

  • Pozwól na dowolne obciążenia = TAK
  • Domeny wyjątkowe (wstaw tutaj swoją domenę http)

4

Dla tych, którzy tu przybyli, próbując znaleźć powód, dla którego ich WKWebView jest zawsze biały i nic nie ładuje (dokładnie tak, jak opisano tutaj, jak sprawić, aby WKWebView działał szybko i dla aplikacji macOS ):

Jeśli powyższe informacje dotyczące rakiet nie działają, sprawdź oczywiste: ustawienia piaskownicy

ustawienia piaskownicy]

Będąc nowym w swift i kakao, ale z dużym doświadczeniem w programowaniu, spędziłem około 20 godzin na znalezieniu tego rozwiązania. Żaden tuzin samouczków hipster-iOS ani Apple Keynotes - nic nie wspomina o tym małym polu wyboru.


O mój boże, dziękuję bardzo! Zapisałeś mi to samo 20-godzinne wyszukiwanie!
Brecht Machiels

2
nie widzę tej sekcji w sekcji Możliwości celu (Xcode 9.4.1)
shim

3

Domyślnie iOS pozwala tylko na HTTPS API. Ponieważ HTTP nie jest bezpieczny, musisz wyłączyć zabezpieczenia transportu aplikacji. Istnieją dwa sposoby wyłączenia ATS: -

1. Dodanie kodu źródłowego w projekcie info.plist i dodaj następujący kod w znaczniku root.

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

2. Korzystanie z informacji o projekcie.

Kliknij projekt w lewym okienku, wybierz projekt jako cel i wybierz kartę informacyjną. Musisz dodać słownik w następującej strukturze.

wprowadź opis zdjęcia tutaj




0

W przypadku Cordova, jeśli chcesz dodać go do pliku ios.json, wykonaj następujące czynności:

"NSAppTransportSecurity": [
   {
      "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
   }
]

I powinno znajdować się w:

"*-Info.plist": {
   "parents": {
   }
}

Po prostu <access origin = "*" /> w config.xml nie działało. Nie jestem pewien, czy oba są konieczne, ale rozwiązanie ios.json przypieczętowało mnie.
zeusstl

Dlaczego jest NSAllowsArbitraryLoadsustawiony na true? Obniżasz cel ATS. Zobacz także Najbardziej niebezpieczny kod na świecie: sprawdzanie poprawności certyfikatów SSL w oprogramowaniu innym niż przeglądarka . Twoje oprogramowanie właśnie znalazło się na liście.
jww

-1

Jak wielu zauważyło, jest to problem związany z funkcją iOS 9.0. Dodali coś o nazwie App Transport Security, a ja również byłem zirytowany, gdy zepsuło to moje aplikacje.

Możesz bandażować go za pomocą klucza NSAllowsArbitraryLoads na TAK w słowniku NSAppTransportSecurity w pliku .plist, ale ostatecznie będziesz musiał ponownie napisać kod tworzący adresy URL, aby utworzyć prefiks HTTPS: //.

Apple przepisało klasę NSUrlConnection w iOS 9.0. Możesz o tym przeczytać w NSURLConnection .

W przeciwnym razie może być konieczne wycofanie się z iOS 9.0, dopóki nie będziesz mieć czasu na wdrożenie właściwego rozwiązania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.