Kako poklicati notranji API iz aplikacije iPhone prek VPN
Klasificirajte neuspešno zahtevo po njeni kodi NSURLError, preden se dotaknete tunela, nato popravite točno tisto plast, ki se je resnično zlomila.
API odgovori v Safariju na istem telefonu, medtem ko zahteva aplikacije poteče. Ta razlika običajno ni tunel: aplikacija, ki kliče notranjo storitev, pošlje običajno zahtevo HTTPS, in obstoječi VPN v napravi odloči le, ali ima ta zahteva pot. Zapisati v aplikacijo drugi tunel je produktna odločitev, ne popravilo za potek. Naslednje klasificira napako glede na to, kje se zgodi, z uporabo površine napak, ki jo aplikacija že ima.
Začnite z napako, ne s tunelom
URLSession sporoča prenosne napake kot NSError vrednosti v NSURLErrorDomain, in koda je najcenejši razpoložljivi dokaz. Preden spremenite katero koli konfiguracijo, zabeležite to kodo skupaj z imenom gostitelja, ki ne uspe, in pretečenim časom naloge. Potek, napaka imena in napaka zaupanja so na zaslonu videti enako in zahtevajo tri različna popravila. Najprej klasificirajte, nato preberite razdelek za ta razred.
Metrike naloge odgovarjajo na naslednje vprašanje, ali je bila povezava sploh vzpostavljena, kar loči zahtevo, ki ni imela nikoli poti, od tiste, na katero je strežnik odgovoril prepozno. Nič od tega ne zahteva spremembe tunela; zahteva, da se diagnostika same zahteve natisne nekam, kjer jo lahko preberete.
Razreševanje imen ne uspe pred vsem drugim
Kratko pisarniško ime, kot je api.corp.example običajno odvisno od iskalne domene, ki je telefon nima, zato aplikacija razreši ime, ki obstaja samo znotraj stavbe. NSURLErrorCannotFindHost je podpis. Polno ime gostitelja je treba razrešiti prek katerega koli razreševalnika, ki ga VPN namesti, in aplikacija bi morala zahtevati popolnoma kvalificirano obliko, kadar iskalna domena ni zagotovljena. Zamenjava imena z naslovom in izklop preverjanj potrdil premakne napako, namesto da bi jo popravila.
Zasebni zapis DNS in potrdilo, izdano za točno to ime, sta podprti par. Vse drugo je obhod, ki pride do uporabnikov.
Potek je vprašanje poti, ne imena
NSURLErrorTimedOut pomeni, da je bilo ime razrešeno in ni nihče odgovoril, kar kaže na pot, politiko paketov ali storitev. Ko je tunel dodeljen na aplikacijo, druga aplikacija, ki doseže isti strežnik, ne pove ničesar o vaši gradnji, ker to preslikavanje ni skupno. Preverite, ali je paket, ki ga izvajate, znotraj te dodelitve, nato preverite, ali je pot storitve zanj dovoljena. Razvojna gradnja, nameščena zunaj dodelitve, je lahko povsem zunaj tunela in je videti kot pokvarjen API.
Primerjava v brskalniku pokaže, da ima neka aplikacija v napravi pot. Nikoli ne dokaže, da jo ima vaša gradnja, zato je treba oba testa izvesti ločeno.
Napake zaupanja se nanašajo na ime na potrdilu
NSURLErrorServerCertificateUntrusted skupaj z napako TLS pod njim pomeni, da je veriga ali preverjanje identitete spodletelo. Notranji CA mora biti v napravi zaupanja vreden, potrdilo, izdano za drugo ime gostitelja, pa ostane napačno po kakršni koli ponovni konfiguraciji omrežja. Smernice App Transport Security družbe Apple še naprej veljajo za te povezave, ki nalagajo URL, in tunel okoli običajne storitve HTTP te storitve ne naredi varne od konca do konca.
Popravite identiteto ali sidro zaupanja in pustite seznam izjem prazen. Splošna izjema za poljubno nalaganje skrije napako med razvojem in jo pozneje pusti na mestu za vsakega uporabnika.
Zavrnitev HTTP pripada aplikaciji, ne omrežju
401 ali 403 po zaključenem rokovanju pomeni, da je zahteva prispela in da jo je storitev zavrnila, zato je preostalo vprašanje račun, občinstvo žetona, obseg ali ključ. Zabeležite kodo stanja in ime gostitelja, nikoli nosilnega žetona ali telesa odgovora. Takrat tunel opravlja svoje delo in nadaljnje omrežne spremembe le odložijo pravo popravilo.
Tabela je klasifikacija, ki jo hranite ob terminalu: ena vrstica za vsako napako, ki jo aplikacija res lahko sporoči. Natisnite kodo, preden jo preberete, ker vrstica, ki jo izberete, odloči, kateri razdelek boste predelali.
| 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 |
Vsaka vrstica je ceneje preizkusiti kot tisto pod njo in vsaka izključi drugo plast iste zahteve. Pomikajte se po tabeli navzdol, dokler se vrstica ne ujema, nato prenehajte spreminjati omrežje.