Ako volať interné API z aplikácie pre iPhone cez VPN
Klasifikujte neúspešnú požiadavku podľa jej kódu NSURLError, skôr než sa dotknete tunela, a potom opravte presne tú vrstvu, ktorá sa skutočne pokazila.
API odpovedá v Safari na tom istom telefóne, no požiadavka aplikácie vyprší. Tento rozdiel zvyčajne nie je tunel: aplikácia, ktorá volá internú službu, posiela bežnú požiadavku HTTPS a existujúca VPN v zariadení rozhoduje len o tom, či má táto požiadavka cestu. Napísať do aplikácie druhý tunel je produktové rozhodnutie, nie oprava vypršania. Nasledujúce klasifikuje zlyhanie podľa toho, kde nastáva, s využitím chybovej plochy, ktorú aplikácia už má.
Začnite chybou, nie tunelom
URLSession hlási prenosové zlyhania ako NSError hodnoty v NSURLErrorDomain, a kód je najlacnejší dostupný dôkaz. Pred zmenou akejkoľvek konfigurácie zaznamenajte tento kód spolu s neúspešným názvom hostiteľa a uplynutým časom úlohy. Vypršanie, zlyhanie názvu a zlyhanie dôvery vyzerajú na obrazovke rovnako a vyžadujú tri rôzne opravy. Najprv klasifikujte, potom čítajte sekciu pre túto triedu.
Metriky úlohy odpovedajú na ďalšiu otázku, či bolo vôbec nadviazané spojenie, čo oddeľuje požiadavku, ktorá nikdy nemala trasu, od tej, na ktorú server odpovedal príliš neskoro. Nič z toho nevyžaduje zmenu tunela; vyžaduje to vytlačiť diagnostiku samotnej požiadavky niekde, kde si ju môžete prečítať.
Preklad názvov zlyháva skôr než čokoľvek iné
Krátky kancelársky názov ako api.corp.example zvyčajne závisí od vyhľadávacej domény, ktorú telefón nemá, takže aplikácia preloží názov, ktorý existuje iba vo vnútri budovy. NSURLErrorCannotFindHost je podpis. Celý názov hostiteľa sa musí preložiť cez akýkoľvek resolver, ktorý VPN nainštaluje, a aplikácia by mala žiadať plne kvalifikovanú formu vždy, keď vyhľadávacia doména nie je zaručená. Nahradenie názvu adresou a vypnutie kontrol certifikátov presúva zlyhanie namiesto toho, aby ho opravilo.
Súkromný záznam DNS a certifikát vydaný presne pre tento názov sú podporovaná dvojica. Všetko ostatné je obchádzka, ktorá sa dostane k používateľom.
Vypršanie je otázka cesty, nie názvu
NSURLErrorTimedOut znamená, že názov sa preložil a nič neodpovedalo, čo ukazuje na trasu, politiku paketov alebo službu. Keď je tunel priradený pre každú aplikáciu, iná aplikácia, ktorá dosiahne ten istý server, nehovorí o vašom zostavení nič, pretože toto mapovanie nie je zdieľané. Skontrolujte, či je spúšťaný balík vnútri tohto priradenia, a potom skontrolujte, či je preň cesta služby povolená. Vývojové zostavenie nainštalované mimo priradenia môže stáť úplne mimo tunela a vyzerať ako pokazené API.
Porovnanie v prehliadači ukazuje, že nejaká aplikácia v zariadení má cestu. Nikdy to nedokazuje vaše zostavenie, a preto sa oba testy musia vykonať oddelene.
Zlyhania dôvery sa týkajú názvu na certifikáte
NSURLErrorServerCertificateUntrusted spolu s chybou TLS pod ním znamená, že reťaz alebo kontrola identity zlyhala. Interná CA musí byť v zariadení dôveryhodná a certifikát vydaný pre iný názov hostiteľa zostáva nesprávny po akejkoľvek rekonfigurácii siete. Usmernenie App Transport Security od Apple sa naďalej vzťahuje na tieto pripojenia načítavajúce URL a tunel okolo obyčajnej služby HTTP nerobí túto službu bezpečnou od konca do konca.
Opravte identitu alebo kotvu dôvery a zoznam výnimiek nechajte prázdny. Plošná výnimka pre ľubovoľné načítavanie skrýva zlyhanie počas vývoja a potom ho necháva na mieste pre každého používateľa.
Odmietnutie HTTP patrí aplikácii, nie sieti
401 alebo 403 po dokončenom handshake znamená, že požiadavka dorazila a služba ju odmietla, takže zostávajúca otázka je účet, publikum tokenu, rozsah alebo kľúč. Zaznamenajte stavový kód a názov hostiteľa, nikdy nosný token ani telo odpovede. V tom momente tunel robí svoju prácu a ďalšie sieťové zmeny len odkladajú skutočnú opravu.
Tabuľka je klasifikácia, ktorú si nechajte pri termináli: jeden riadok pre každé zlyhanie, ktoré aplikácia skutočne môže nahlásiť. Vytlačte kód skôr, než ho prečítate, pretože riadok, ktorý vyberiete, rozhoduje o tom, ktorú sekciu prejdete.
| 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ždý riadok sa testuje lacnejšie ako ten pod ním a každý vylučuje inú vrstvu tej istej požiadavky. Postupujte tabuľkou nadol, kým riadok nesedí, a potom prestaňte meniť sieť.