Sådan kalder du en intern API fra en iPhone-app via VPN
Klassificér den fejlende anmodning efter dens NSURLError-kode, før du rører tunnelen, og reparér derefter netop det lag, der faktisk gik i stykker.
API'et svarer i Safari på samme telefon, mens appens anmodning løber ud i en timeout. Det gab er normalt ikke tunnelen: en app, der kalder en intern tjeneste, sender en almindelig HTTPS-anmodning, og enhedens eksisterende VPN afgør kun, om den anmodning har en vej. At skrive en anden tunnel ind i appen er en produktbeslutning, ikke en reparation af en timeout. Det følgende klassificerer fejlen efter, hvor den opstår, ved hjælp af den fejlflade, appen allerede har.
Start ved fejlen, ikke ved tunnelen
URLSession rapporterer transportfejl som NSError værdier i NSURLErrorDomain, og koden er det billigste tilgængelige bevis. Før du ændrer nogen konfiguration, skal du logge den kode sammen med det fejlende værtsnavn og opgavens forløbne tid. En timeout, en navnefejl og en tillidsfejl ser ens ud på skærmen og kræver tre forskellige reparationer. Klassificér først, og læs derefter afsnittet for den klasse.
Opgavemålinger besvarer opfølgningsspørgsmålet, om der nogensinde blev oprettet en forbindelse, hvilket adskiller en anmodning, der aldrig havde en rute, fra en, som serveren var for længe om at besvare. Intet af dette kræver, at tunnelen ændres; det kræver, at anmodningens egne diagnostikdata udskrives et sted, hvor du kan læse dem.
Navneopløsning fejler, før noget andet kan
Et kort kontornavn som api.corp.example afhænger normalt af et søgedomæne, som telefonen ikke har, så appen opløser et navn, der kun findes inde i bygningen. NSURLErrorCannotFindHost er signaturen. Det fulde værtsnavn skal opløses gennem den resolver, VPN installerer, og appen bør anmode om den fuldt kvalificerede form, når søgedomænet ikke er garanteret. At bytte navnet ud med en adresse og slå certifikatkontroller fra flytter fejlen i stedet for at rette den.
En privat DNS-post og et certifikat udstedt til netop det navn er det understøttede par. Alt andet er en omvej, der sendes til brugerne.
En timeout er et spørgsmål om vej, ikke om navn
NSURLErrorTimedOut betyder, at navnet blev opløst, og intet svarede, hvilket peger på ruten, pakkepolitikken eller tjenesten. Når tunnelen tildeles pr. applikation, siger en anden app, der når den samme server, intet om dit build, fordi den mapping ikke deles. Kontrollér, at det bundt du kører, er inde i den tildeling, og kontrollér derefter, at tjenestestien er tilladt for det. Et udviklingsbuild installeret uden for tildelingen kan ligge helt uden for tunnelen og se ud som et ødelagt API.
En browsersammenligning viser, at en eller anden app på enheden har en vej. Det beviser aldrig, at dit build har det, og derfor skal de to tests køres hver for sig.
Tillidsfejl handler om navnet på certifikatet
NSURLErrorServerCertificateUntrusted sammen med TLS-fejlen nedenunder betyder, at kæden eller identitetskontrollen fejlede. En intern CA skal være betroet på enheden, og et certifikat udstedt til et andet værtsnavn er stadig forkert efter enhver omkonfigurering af netværket. Apples vejledning om App Transport Security gælder fortsat for disse URL-indlæsende forbindelser, og en tunnel omkring en almindelig HTTP-tjeneste gør ikke den tjeneste sikker fra ende til anden.
Ret identiteten eller tillidsankeret og hold undtagelseslisten tom. En blanket undtagelse for vilkårlig indlæsning skjuler fejlen under udvikling og efterlader den på plads for hver bruger bagefter.
En HTTP-afvisning tilhører appen, ikke netværket
En 401 eller 403 på et afsluttet håndtryk betyder, at anmodningen ankom, og tjenesten afviste den, så det resterende spørgsmål er en konto, en tokenmålgruppe, et omfang eller en nøgle. Log statuskoden og værtsnavnet, aldrig bærertokenet eller svarteksten. På det tidspunkt gør tunnelen sit arbejde, og yderligere netværksændringer udskyder kun den rigtige rettelse.
Tabellen er klassificeringen, du skal have ved terminalen: én række pr. fejl, appen faktisk kan rapportere. Udskriv koden, før du læser den, fordi den række, du vælger, afgør, hvilket afsnit du arbejder igennem.
| 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 |
Hver række er billigere at teste end den nedenunder, og hver udelukker et andet lag af den samme anmodning. Gå ned gennem tabellen, indtil en række passer, og stop derefter med at ændre netværket.