Problem: nasza aplikacja mobilna nie może już ustanowić bezpiecznego połączenia z naszą usługą internetową, ponieważ iOS 9 używa teraz ATS.
Tło: iOS 9 wprowadza App Transport Security
Konfiguracja serwera: Windows Server 2008 R2 SP1 (VM) IIS 7.5, certyfikaty SSL od digicert. Zapora systemu Windows wyłączona.
Kluczowe bity RSA 2048 (E 65537)
Wystawca DigiCert SHA2 Secure Server CA
Algorytm podpisu SHA512 zRSA
Są to wymagania dotyczące bezpieczeństwa aplikacji do transportu:
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 SHA256 lub lepszego, z kluczem RSA o długości 2048 bitów lub większym lub z 256-bitową lub większą krzywą eliptyczną Klawisz (ECC). Nieprawidłowe certyfikaty powodują ciężką awarię i brak połączenia. Oto akceptowane szyfry:
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
Co zostało wypróbowane:
- Dodanie wyjątków w aplikacji mobilnej, aby umożliwić działanie naszej domeny, ale nie chcę korzystać z tej niezabezpieczonej metody, chcę naprawić nasze SSL.
- Używane IIS Crypto używać „dobrych praktyk”, próbował „pci” oraz niestandardowych ustawień. Próbowałem nawet zmodyfikować pakiet kryptograficzny tylko do powyższej listy i zmienić jego kolejność. Po każdej próbie serwer jest uruchamiany ponownie i uruchamiane są Laboratorium SSL (po wyczyszczeniu pamięci podręcznej). Udało mi się przejść z oceny F na A, a nawet A, ale to tylko spowodowało, że iOS 8 i 9 nie były w stanie ustanowić bezpiecznych połączeń. (Kod NSURLErrorDomain = -1200 i _kCFStreamErrorCodeKey = -9806)
- Przywróciłem maszynę wirtualną i wypróbowałem skrypt PowerShell Skonfiguruj IIS dla SSL Perfect Forward Secrecy i TLS 1.2 Podjąłem nawet drugą próbę, w której wyedytowałem szyfry ze skryptu zasilania na minimalną listę wymaganych elementów.
Wyniki: Zawsze podobne, oceny A lub A-. iOS8 i iOS9 nie mogą negocjować bezpiecznego połączenia. Symulacja uzgadniania powoduje „niedopasowanie protokołu lub zestawu szyfrów” dla produktów Safari i iOS.
AKTUALIZACJA Po pracy ze wsparciem Apple wykonaliśmy przechwytywanie śledzenia pakietów:
$ tcpdump -n -r trace.pcap
reading from file trace.pcap, link-type EN10MB (Ethernet)
client > server [S], seq 1750839998, win 65535, length 0
server > client [S.], seq 2461151276, ack 1750839999, win 8192, length 0
client > server [.], ack 1, win 4104, length 0
client > server [P.], seq 1:175, ack 1, win 4104, length 174
server > client [R.], seq 1, ack 175, win 0, length 0
Pierwsze trzy pakiety to klasyczny trójdrożny uścisk dłoni SYN - SYN-ACK - ACK, który ustanawia połączenie TCP. Czwarty pakiet to iOS wysyłający do serwera wiadomość Hello Hello klienta TLS, pierwszy krok w konfiguracji połączenia TLS przez to połączenie TCP. Rozebrałem tę wiadomość i wygląda ona dość rozsądnie. W piątym pakiecie serwer po prostu przerywa połączenie (wysyłając RST).
Czy ktoś wie, dlaczego IIS 7.5 robi RST?