Jak wywołać wewnętrzne API z aplikacji iPhone przez VPN
Sklasyfikuj nieudane żądanie według jego kodu NSURLError, zanim dotkniesz tunelu, a następnie napraw dokładnie tę warstwę, która naprawdę się zepsuła.
API odpowiada w Safari na tym samym telefonie, a żądanie aplikacji kończy się przekroczeniem czasu. Ta różnica zwykle nie jest tunelem: aplikacja wywołująca wewnętrzną usługę wysyła zwykłe żądanie HTTPS, a istniejący VPN na urządzeniu decyduje tylko, czy to żądanie ma trasę. Zapisanie drugiego tunelu w aplikacji to decyzja produktowa, a nie naprawa przekroczenia czasu. Poniższe klasyfikuje awarię według miejsca jej wystąpienia, korzystając z powierzchni błędów, którą aplikacja już ma.
Zacznij od błędu, nie od tunelu
URLSession zgłasza błędy transportu jako NSError wartości w NSURLErrorDomain, a kod jest najtańszym dostępnym dowodem. Przed zmianą jakiejkolwiek konfiguracji zapisz ten kod wraz z nazwą hosta, która zawodzi, i upływem czasu zadania. Przekroczenie czasu, błąd nazwy i błąd zaufania wyglądają na ekranie identycznie i wymagają trzech różnych napraw. Najpierw sklasyfikuj, potem przeczytaj sekcję dla tej klasy.
Metryki zadania odpowiadają na kolejne pytanie, czy kiedykolwiek nawiązano połączenie, co oddziela żądanie, które nigdy nie miało trasy, od takiego, na które serwer odpowiadał zbyt długo. Nic z tego nie wymaga zmiany tunelu; wymaga wydrukowania diagnostyki samego żądania w miejscu, w którym można ją odczytać.
Rozwiązywanie nazw zawodzi przed czymkolwiek innym
Krótka nazwa biurowa, taka jak api.corp.example zwykle zależy od domeny wyszukiwania, której telefon nie ma, więc aplikacja rozwiązuje nazwę istniejącą tylko wewnątrz budynku. NSURLErrorCannotFindHost to sygnatura. Pełna nazwa hosta musi zostać rozwiązana przez dowolny resolver instalowany przez VPN, a aplikacja powinna żądać formy w pełni kwalifikowanej, gdy domena wyszukiwania nie jest gwarantowana. Zamiana nazwy na adres i wyłączenie sprawdzania certyfikatów przenosi awarię, zamiast ją naprawiać.
Prywatny rekord DNS i certyfikat wystawiony dokładnie dla tej nazwy to obsługiwana para. Wszystko inne to obejście, które trafia do użytkowników.
Przekroczenie czasu to kwestia trasy, a nie nazwy
NSURLErrorTimedOut oznacza, że nazwa została rozwiązana i nic nie odpowiedziało, co wskazuje na trasę, politykę pakietów lub usługę. Gdy tunel jest przypisany do aplikacji, inna aplikacja docierająca do tego samego serwera nic nie mówi o twojej kompilacji, ponieważ to mapowanie nie jest współdzielone. Sprawdź, czy uruchamiany pakiet znajduje się w tym przypisaniu, a następnie sprawdź, czy ścieżka usługi jest dla niego dozwolona. Kompilacja deweloperska zainstalowana poza przypisaniem może znajdować się całkowicie poza tunelem i wyglądać jak zepsute API.
Porównanie w przeglądarce pokazuje, że jakaś aplikacja na urządzeniu ma trasę. Nigdy nie dowodzi, że twoja kompilacja ją ma, dlatego oba testy trzeba wykonać osobno.
Błędy zaufania dotyczą nazwy na certyfikacie
NSURLErrorServerCertificateUntrusted razem z błędem TLS pod nim oznacza, że łańcuch lub sprawdzenie tożsamości zawiodły. Wewnętrzny CA musi być zaufany na urządzeniu, a certyfikat wystawiony dla innej nazwy hosta pozostaje błędny po dowolnej rekonfiguracji sieci. Wskazówki App Transport Security firmy Apple nadal dotyczą tych połączeń wczytujących URL, a tunel wokół zwykłej usługi HTTP nie czyni tej usługi bezpieczną od końca do końca.
Napraw tożsamość lub kotwicę zaufania i pozostaw listę wyjątków pustą. Ogólny wyjątek dla dowolnego wczytywania ukrywa awarię podczas prac rozwojowych i zostawia ją na miejscu dla każdego użytkownika później.
Odmowa HTTP należy do aplikacji, nie do sieci
401 lub 403 po zakończonym uścisku dłoni oznacza, że żądanie dotarło, a usługa je odrzuciła, więc pozostałe pytanie to konto, odbiorca tokenu, zakres lub klucz. Zapisuj kod stanu i nazwę hosta, nigdy tokenu okaziciela ani treści odpowiedzi. W tym momencie tunel robi swoje, a dalsze zmiany sieci tylko opóźniają prawdziwą naprawę.
Tabela to klasyfikacja, którą warto trzymać obok terminala: jeden wiersz na każdą awarię, którą aplikacja naprawdę może zgłosić. Wydrukuj kod, zanim go przeczytasz, ponieważ wybrany wiersz decyduje, którą sekcję przejdziesz.
| Where it fails | What the app sees | First check |
|---|---|---|
| name resolution | NSURLErrorCannotFindHost (-1003) | resolve the fully qualified name from the device itself |
| no path, or no answer | NSURLErrorTimedOut (-1001) | is this bundle inside the per-app mapping, and is the service path allowed |
| TLS trust | NSURLErrorServerCertificateUntrusted (-1202) | does the certificate name match the host, and is the internal CA trusted |
| service refusal | HTTP 401 or 403 after a completed handshake | account, token audience, scope or key |
Każdy wiersz jest tańszy w testowaniu niż ten pod nim, a każdy wyklucza inną warstwę tego samego żądania. Przechodź w dół tabeli, aż wiersz pasuje, a potem przestań zmieniać sieć.