Usługa App Transport Security na platformie Xamarin.iOS

Usługa App Transport Security (ATS) wymusza bezpieczne połączenia między zasobami internetowymi (takimi jak serwer zaplecza aplikacji) i aplikacją.

W tym artykule zostaną wprowadzone zmiany zabezpieczeń wymuszane przez usługę App Transport Security w aplikacji systemu iOS 9 i co to oznacza dla projektów platformy Xamarin.iOS, zostaną omówione opcje konfiguracji usługi ATS. W razie potrzeby zostaną one omówione w jaki sposób zrezygnować z usługi ATS ATS. Ponieważ usługa ATS jest domyślnie włączona, wszystkie niezabezpieczone połączenia internetowe będą zgłaszać wyjątek w aplikacjach systemu iOS 9 (chyba że jawnie to zezwolino).

Informacje o usłudze App Transport Security

Jak wspomniano powyżej, usługa ATS zapewnia, że cała komunikacja internetowa w systemach iOS 9 i OS X El Capitan jest zgodna z najlepszymi rozwiązaniami dotyczącymi bezpiecznego połączenia, zapobiegając przypadkowemu ujawnieniu poufnych informacji bezpośrednio za pośrednictwem aplikacji lub biblioteki, z którą korzysta.

W przypadku istniejących aplikacji zaimplementuj HTTPS protokół zawsze, gdy jest to możliwe. W przypadku nowych aplikacji platformy Xamarin.iOS należy używać HTTPS wyłącznie podczas komunikacji z zasobami internetowymi. Ponadto komunikacja interfejsu API wysokiego poziomu musi być szyfrowana przy użyciu protokołu TLS w wersji 1.2 z tajemnicą przesyłania dalej.

Każde połączenie z serwerem NSUrl Połączenie ion, CFUrl lub NSUrlSession będzie domyślnie używać usługi ATS w aplikacjach utworzonych dla systemów iOS 9 i OS X 10.11 (El Capitan).

Domyślne zachowanie usługi ATS

Ponieważ usługa ATS jest domyślnie włączona w aplikacjach utworzonych dla systemów iOS 9 i OS X 10.11 (El Capitan), wszystkie połączenia korzystające z NSUrl Połączenie ion, CFUrl lub NSUrlSession będą objęte wymaganiami dotyczącymi zabezpieczeń usługi ATS. Jeśli połączenia nie spełniają tych wymagań, nie powiedzą się z wyjątkiem.

Wymagania dotyczące Połączenie ion usługi ATS

Usługa ATS wymusi następujące wymagania dotyczące wszystkich połączeń internetowych:

  • Wszystkie szyfry połączeń muszą używać tajemnicy przesyłania dalej. Zapoznaj się z listą akceptowanych szyfrów poniżej.
  • Protokół Transport Layer Security (TLS) musi być w wersji 1.2 lub nowszej.
  • Dla wszystkich certyfikatów należy użyć co najmniej odcisku palca SHA256 z kluczem RSA 2048 lub większym lub 256-bitowym lub większym kluczem Elliptic-Curve (ECC).

Ponownie, ponieważ usługa ATS jest domyślnie włączona w systemie iOS 9, każda próba nawiązania połączenia, które nie spełnia tych wymagań, spowoduje zgłoszenie wyjątku.

Szyfry zgodne z usługą ATS

Następujący typ szyfru tajemnicy jest akceptowany przez zabezpieczoną komunikację internetową usługi 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

Aby uzyskać więcej informacji na temat pracy z klasami komunikacji internetowej systemu iOS, zobacz Dokumentacja klasy NSURL Połączenie ion firmy Apple lub Dokumentacja klasy NSURLSession.

Obsługa usługi ATS na platformie Xamarin.iOS

Ponieważ usługa ATS jest domyślnie włączona w systemach iOS 9 i OS X El Capitan, jeśli aplikacja Xamarin.iOS lub dowolna biblioteka lub usługa, której używa, nawiązuje połączenie z Internetem, musisz wykonać pewne działania lub połączenia spowodują zgłoszenie wyjątku.

W przypadku istniejącej aplikacji firma Apple sugeruje, że obsługuje protokół HTTPS tak szybko, jak to możliwe. Jeśli nie możesz, ponieważ łączysz się z usługą internetową innej firmy, która nie obsługuje HTTPS , lub jeśli obsługa HTTPS będzie niepraktyczna, możesz zrezygnować z usługi ATS. Aby uzyskać więcej informacji, zobacz sekcję Rezygnacja z usługi ATS poniżej.

W przypadku nowej aplikacji platformy Xamarin.iOS należy używać HTTPS wyłącznie podczas komunikowania się z zasobami internetowymi. Ponownie mogą wystąpić sytuacje (takie jak korzystanie z usługi internetowej innej firmy), w których nie jest to możliwe i należy zrezygnować z usługi ATS.

Ponadto usługa ATS wymusza szyfrowanie komunikacji interfejsu API wysokiego poziomu przy użyciu protokołu TLS w wersji 1.2 z tajemnicą przesyłania dalej. Aby uzyskać więcej informacji, zobacz sekcje Wymagania Połączenie ion usługi ATS i Szyfrowanie zgodne z usługą ATS powyżej.

Chociaż być może nie znasz protokołu TLS (Transport Layer Security), jest to następca protokołu SSL (Secure Socket Layer) i zapewnia kolekcję protokołów kryptograficznych w celu wymuszania zabezpieczeń za pośrednictwem połączeń sieciowych.

Poziom protokołu TLS jest kontrolowany przez usługę internetową, z której korzystasz, i dlatego znajduje się poza kontrolą aplikacji. Zarówno element , jak HttpClient i ModernHttpClient powinien automatycznie używać najwyższego poziomu szyfrowania TLS obsługiwanego przez serwer.

W zależności od serwera, z którym rozmawiasz (zwłaszcza jeśli jest to usługa innej firmy), może być konieczne wyłączenie tajemnicy przesyłania dalej lub wybranie niższego poziomu protokołu TLS. Aby uzyskać więcej informacji, zobacz sekcję Konfigurowanie opcji usługi ATS poniżej.

Ważne

Usługa App Transport Security nie ma zastosowania do aplikacji platformy Xamarin przy użyciu implementacji zarządzanego klienta HTTPClient. Dotyczy to połączeń korzystających tylko z implementacji KLIENTA HTTPClient CFNetwork lub implementacji HTTPClient NSURLSession.

Ustawianie implementacji klienta HTTPClient

Aby ustawić implementację klienta HTTPClient używaną przez aplikację systemu iOS, kliknij dwukrotnie projekt w Eksplorator rozwiązań, aby otworzyć opcje projektu. Przejdź do pozycji Kompilacja systemu iOS i wybierz żądany typ klienta na liście rozwijanej Implementacja klienta HttpClient:

Setting the iOS Build Options

Zarządzana procedura obsługi

Program obsługi zarządzanej to w pełni zarządzana procedura obsługi HttpClient, która została dostarczona z poprzednimi wersjami platformy Xamarin.iOS i jest domyślną procedurą obsługi.

Zalety:

  • Jest to najbardziej zgodne z platformą Microsoft .NET i starszą wersją platformy Xamarin.

Wady:

  • Nie jest ona w pełni zintegrowana z systemem iOS (np. jest ograniczona do protokołu TLS 1.0).
  • Jest to zwykle znacznie wolniejsze niż natywne interfejsy API.
  • Wymaga to bardziej zarządzanego kodu i tworzy większe aplikacje.

Program obsługi CFNetwork

Program obsługi oparty na usłudze CFNetwork jest oparty na strukturze natywnej CFNetwork .

Zalety:

  • Używa natywnego interfejsu API w celu uzyskania lepszej wydajności i mniejszych rozmiarów plików wykonywalnych.
  • Dodaje obsługę nowszych standardów, takich jak TLS 1.2.

Wady:

  • Wymaga systemu iOS 6 lub nowszego.
  • Niedostępne w systemie watchOS.
  • Niektóre funkcje i opcje httpclient nie są dostępne.

Program obsługi NSUrlSession

Program obsługi oparty na NSUrlSession jest oparty na natywnym NSUrlSession interfejsie API.

Zalety:

  • Używa natywnego interfejsu API w celu uzyskania lepszej wydajności i mniejszych rozmiarów plików wykonywalnych.
  • Dodaje obsługę nowszych standardów, takich jak TLS 1.2.

Wady:

  • Wymaga systemu iOS 7 lub nowszego.
  • Niektóre funkcje i opcje httpclient nie są dostępne.

Diagnozowanie problemów z usługą ATS

Podczas próby nawiązania połączenia z Internetem bezpośrednio lub z widoku internetowego w systemie iOS 9 może wystąpić błąd w formularzu:

Usługa App Transport Security zablokowała ładowanie zasobów HTTP () w postaci zwykłego tekstu,http://www.-the-blocked-domain.com ponieważ jest niezabezpieczone. Wyjątki tymczasowe można skonfigurować za pośrednictwem pliku Info.plist aplikacji.

W systemie iOS9 usługa App Transport Security (ATS) wymusza bezpieczne połączenia między zasobami internetowymi (takimi jak serwer zaplecza aplikacji) i aplikacją. Ponadto usługa ATS wymaga komunikacji przy użyciu protokołu i komunikacji interfejsu HTTPS API wysokiego poziomu do szyfrowania przy użyciu protokołu TLS w wersji 1.2 z tajemnicą przesyłania dalej.

Ponieważ usługa ATS jest domyślnie włączona w aplikacjach utworzonych dla systemów iOS 9 i OS X 10.11 (El Capitan), wszystkie połączenia korzystające z systemu NSURLConnectionCFURL lub NSURLSession będą objęte wymaganiami dotyczącymi zabezpieczeń usługi ATS. Jeśli połączenia nie spełniają tych wymagań, nie powiedzą się z wyjątkiem.

Firma Apple udostępnia również przykładową aplikację TLSTool, którą można skompilować (lub opcjonalnie transkodować w środowisku Xamarin i C#) oraz używać do diagnozowania problemów z usługą ATS/TLS. Aby uzyskać informacje na temat rozwiązywania tego problemu, zobacz sekcję Rezygnacja z usługi ATS poniżej.

Konfigurowanie opcji usługi ATS

Możesz skonfigurować kilka funkcji usługi ATS, ustawiając wartości dla określonych kluczy w pliku Info.plist aplikacji. Dostępne są następujące klucze do kontrolowania usługi ATS (wcięcie, aby pokazać, jak są zagnieżdżone):

NSAppTransportSecurity
    NSAllowsArbitraryLoads
    NSAllowsArbitraryLoadsInWebContent
    NSExceptionDomains
    <domain-name-for-exception-as-string>
        NSExceptionMinimumTLSVersion
        NSExceptionRequiresForwardSecrecy
        NSExceptionAllowsInsecureHTTPLoads
        NSRequiresCertificateTransparency
        NSIncludesSubdomains
        NSThirdPartyExceptionMinimumTLSVersion
        NSThirdPartyExceptionRequiresForwardSecrecy
        NSThirdPartyExceptionAllowsInsecureHTTPLoads

Każdy klucz ma następujący typ i znaczenie:

  • NSAppTransportSecurity (Dictionary) — zawiera wszystkie klucze i wartości ustawień usługi ATS.
  • NSAllowsArbitraryLoads (Boolean) — jeśli YES usługa ATS zostanie wyłączona dla żadnej domeny, która nie ma na liście .NSExceptionDomains W przypadku domen wymienionych zostaną użyte określone ustawienia zabezpieczeń.
  • NSAllowsArbitraryLoadsInWebContent (Boolean) — jeśli YES zezwoli na poprawne ładowanie stron internetowych, podczas gdy ochrona usługi Apple Transport Security (ATS) jest nadal włączona dla pozostałej części aplikacji.
  • NSExceptionDomains (Dictionary) — kolekcja domen, które i ustawienia zabezpieczeń, które usługi ATS powinny być używane dla danej domeny.
  • <domain-name-for-exception-as-string> (Dictionary) — kolekcja wyjątków dla danej domeny (np. www.xamarin.com).
  • NSExceptionMinimumTLSVersion (String) — minimalna wersja protokołu TLS jako TLSv1.0, TLSv1.1 lub TLSv1.2 (która jest domyślna).
  • NSExceptionRequiresForwardSecrecy (Boolean) — jeśli NO domena nie musi używać szyfru z zabezpieczeniami przesyłania dalej. Domyślna wartość to YES.
  • NSExceptionAllowsInsecureHTTPLoads (Boolean) — jeśli NO (wartość domyślna) wszystkie komunikaty z tą domeną muszą znajdować się w protokole HTTPS .
  • NSRequiresCertificateTransparency (Boolean) — jeśli YES domena Secure Sockets Layer (SSL) musi zawierać prawidłowe dane przezroczystości. Domyślna wartość to NO.
  • NSIncludesSubdomains (Boolean) — jeśli YES te ustawienia zastąpią wszystkie poddomeny tej domeny. Domyślna wartość to NO.
  • NSThirdPartyExceptionMinimumTLSVersion (String) — wersja protokołu TLS używana, gdy domena jest usługą innej firmy poza kontrolą dewelopera.
  • NSThirdPartyExceptionRequiresForwardSecrecy (Boolean) — jeśli YES domena innej firmy wymaga tajemnicy przesyłania dalej.
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads (Boolean) — jeśli YES usługa ATS zezwoli na bezpieczną komunikację z domenami innych firm.

Rezygnacja z usługi ATS

Chociaż firma Apple zdecydowanie sugeruje korzystanie z HTTPS protokołu i bezpiecznej komunikacji z informacjami internetowymi, czasami może to nie zawsze być możliwe. Jeśli na przykład komunikujesz się z usługą internetową innej firmy lub korzystasz z reklam dostarczanych z Internetu w aplikacji.

Jeśli aplikacja Xamarin.iOS musi wysłać żądanie do niezabezpieczonej domeny, następujące zmiany w pliku Info.plist aplikacji wyłączą wartości domyślne zabezpieczeń wymuszane przez usługę ATS dla danej domeny:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.the-domain-name.com</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

W Visual Studio dla komputerów Mac kliknij Info.plist dwukrotnie plik w Eksplorator rozwiązań, przejdź do widoku Źródło i dodaj powyższe klucze:

The Source view of the Info.plist file after adding specified keys.

Jeśli aplikacja musi załadować i wyświetlić zawartość internetową z niezabezpieczonych witryn, dodaj następujący kod do pliku Info.plist aplikacji, aby umożliwić poprawne ładowanie stron internetowych, podczas gdy ochrona usługi Apple Transport Security (ATS) jest nadal włączona dla pozostałej części aplikacji:

<key>NSAppTransportSecurity</key>
<dict>
    <key> NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

Opcjonalnie możesz wprowadzić następujące zmiany w pliku Info.plist aplikacji, aby całkowicie wyłączyć usługę ATS dla wszystkich domen i komunikacji internetowej:

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

W Visual Studio dla komputerów Mac kliknij Info.plist dwukrotnie plik w Eksplorator rozwiązań, przejdź do widoku Źródło i dodaj powyższe klucze:

The Source view of the Info.plist file after specifying NSAllowsArbitraryLoadsInWebContent and NSAllowsArbitraryLoads.

Ważne

Jeśli aplikacja wymaga połączenia z niezabezpieczoną witryną internetową, zawsze należy wprowadzić domenę jako wyjątek, zamiast wyłączać usługę ATS całkowicie przy użyciu NSExceptionDomains polecenia NSAllowsArbitraryLoads. NSAllowsArbitraryLoads należy używać tylko w skrajnych sytuacjach nadzwyczajnych.

Ponownie wyłączenie usługi ATS powinno być używane tylko w ostateczności, jeśli przełączanie się na bezpieczne połączenia jest niedostępne lub niepraktyczne.

Podsumowanie

W tym artykule przedstawiono usługę App Transport Security (ATS) i opisano sposób wymuszania bezpiecznej komunikacji z Internetem. Najpierw omówiliśmy zmiany wymagane przez usługę ATS dla aplikacji platformy Xamarin.iOS uruchomionej w systemie iOS 9. Następnie omówiliśmy kontrolowanie funkcji i opcji usługi ATS. Na koniec omówiliśmy rezygnację z usługi ATS w aplikacji platformy Xamarin.iOS.