W naszej wewnętrznej sieci używamy samopodpisanego certyfikatu CA. Działa to dobrze od lat, zarówno w Safari, jak i naszym iOS, aż po iOS 10. Po prostu instalujemy certyfikat CA na dowolnym nowym urządzeniu lub symulatorze i wszystko działa, nawet z ATS. Umożliwia to dostęp do wszystkich naszych wewnętrznych serwerów testowych bez konieczności indywidualnego zaufania do każdego serwera.Zainstalowane certyfikaty iOS 11 nie są zaufane automatycznie (podpisane automatycznie)
Począwszy od iOS 11 zainstalowany certyfikat CA nie pozwala już Safari ani naszej aplikacji na zaufanie do certyfikatu dla żadnego z serwerów. Otrzymujemy następujące istotne dane z CFNETWORK_DIAGNOSTICS
włączona do naszej aplikacji:
Error Code kCFErrorDomainCFNetwork Domain = -1200 =
_kCFNetworkCFStreamSSLErrorOriginalValue = -9802
_kCFStreamErrorDomainKey =
_kCFStreamErrorCodeKey = - 9802
NSLocalizedDescription = Wystąpił błąd SSL i bezpieczne połączenie z serwerem r nie można wykonać.
NSLocalizedRecoverySuggestion = Czy mimo to chcesz połączyć się z serwerem?
Spędziłem dużo czasu próbując rozwiązać ten problem, przeszukując StackOverflow i resztę sieci. Chociaż używamy AFNetworking w naszej aplikacji, wydaje się to nieistotne, ponieważ Safari już nie ufa tym serwerom za pośrednictwem CA. Wyłączenie ATS poprzez NSAllowsArbitraryLoads
umożliwia dostęp do serwerów, ale oczywiście nie jest rozwiązaniem.
Nie wprowadzono żadnych zmian w naszym kodzie -URLSession:didReceiveChallenge:completionHandler
, a my mamy odpowiednią (działającą od lat) implementację odpowiedzi na wezwanie przez challenge.protectionSpace.serverTrust
.
Ponownie oceniłem i przetestowałem zarówno certyfikaty urzędu certyfikacji, jak i serwera, w każdym razie, o czym myślę, i działają wszędzie, z wyjątkiem iOS 11. Co mogło się zmienić w ATS na iOS 11, które mogło spowodować ten problem?
Nasz zespół ds. Kontroli jakości zgłosił, że każde urządzenie Apple zaktualizowane do iOS 11 nie może już używać przeglądarki Safari ani przeglądarki Chrome do uzyskiwania dostępu do jakichkolwiek wewnętrznych stron https. Normalny sposób akceptowania certyfikatów z podpisem własnym, który działał przez lata i nadal działa z niezaktualizowanymi urządzeniami, przestał działać. Wygląda na to, że wiele osób ma ten sam problem https://twitter.com/jfsiman/status/910269395959795712 – rob