Πώς να καλέσετε ένα εσωτερικό API από εφαρμογή iPhone μέσω VPN
Ταξινομήστε το αποτυχημένο αίτημα με τον κωδικό NSURLError του πριν αγγίξετε το τούνελ και μετά διορθώστε ακριβώς το επίπεδο που χάλασε.
Το API απαντά στο Safari στο ίδιο τηλέφωνο, ενώ το αίτημα της εφαρμογής λήγει σε χρονικό όριο. Αυτό το κενό συνήθως δεν είναι το τούνελ: μια εφαρμογή που καλεί μια εσωτερική υπηρεσία κάνει ένα συνηθισμένο αίτημα HTTPS, και το υπάρχον VPN της συσκευής αποφασίζει μόνο αν αυτό το αίτημα έχει διαδρομή. Το να γράψετε ένα δεύτερο τούνελ μέσα στην εφαρμογή είναι απόφαση προϊόντος, όχι επισκευή για ένα χρονικό όριο. Τα παρακάτω ταξινομούν την αποτυχία με βάση το πού συμβαίνει, χρησιμοποιώντας την επιφάνεια σφαλμάτων που έχει ήδη η εφαρμογή.
Ξεκινήστε από το σφάλμα, όχι από το τούνελ
URLSession αναφέρει αποτυχίες μεταφοράς ως NSError τιμές στο NSURLErrorDomain, και ο κωδικός είναι η φθηνότερη διαθέσιμη απόδειξη. Πριν αλλάξετε οποιαδήποτε ρύθμιση, καταγράψτε αυτόν τον κωδικό μαζί με το όνομα κεντρικού υπολογιστή που αποτυγχάνει και τον χρόνο της εργασίας. Ένα χρονικό όριο, μια αποτυχία ονόματος και μια αποτυχία εμπιστοσύνης φαίνονται ίδια στην οθόνη και απαιτούν τρεις διαφορετικές επισκευές. Ταξινομήστε πρώτα και μετά διαβάστε την ενότητα για αυτή την κατηγορία.
Οι μετρήσεις εργασίας απαντούν στο επόμενο ερώτημα, αν δημιουργήθηκε ποτέ σύνδεση, κάτι που χωρίζει ένα αίτημα που δεν είχε ποτέ διαδρομή από ένα που ο διακομιστής άργησε υπερβολικά να απαντήσει. Τίποτα από αυτά δεν απαιτεί αλλαγή του τούνελ· απαιτεί τα διαγνωστικά του ίδιου του αιτήματος να εκτυπωθούν κάπου που μπορείτε να τα διαβάσετε.
Η επίλυση ονομάτων αποτυγχάνει πριν προλάβει οτιδήποτε άλλο
Ένα σύντομο όνομα γραφείου όπως api.corp.example συνήθως εξαρτάται από έναν τομέα αναζήτησης που το τηλέφωνο δεν φέρει, οπότε η εφαρμογή επιλύει ένα όνομα που υπάρχει μόνο μέσα στο κτίριο. NSURLErrorCannotFindHost είναι η υπογραφή. Το πλήρες όνομα κεντρικού υπολογιστή πρέπει να επιλυθεί μέσω όποιου resolver εγκαθιστά το VPN, και η εφαρμογή πρέπει να ζητά την πλήρως πιστοποιημένη μορφή όποτε ο τομέας αναζήτησης δεν είναι εγγυημένος. Η αντικατάσταση του ονόματος με διεύθυνση και η απενεργοποίηση των ελέγχων πιστοποιητικών μετακινεί την αποτυχία αντί να τη διορθώνει.
Μια ιδιωτική εγγραφή DNS και ένα πιστοποιητικό που εκδόθηκε για αυτό ακριβώς το όνομα είναι το υποστηριζόμενο ζεύγος. Όλα τα υπόλοιπα είναι μια παράκαμψη που φτάνει στους χρήστες.
Ένα χρονικό όριο είναι ζήτημα διαδρομής, όχι ονόματος
NSURLErrorTimedOut σημαίνει ότι το όνομα επιλύθηκε και τίποτα δεν απάντησε, κάτι που δείχνει στη διαδρομή, στην πολιτική πακέτων ή στην υπηρεσία. Όταν το τούνελ εκχωρείται ανά εφαρμογή, μια άλλη εφαρμογή που φτάνει στον ίδιο διακομιστή δεν λέει τίποτα για τη δική σας έκδοση, επειδή αυτή η αντιστοίχιση δεν κοινοποιείται. Ελέγξτε ότι το πακέτο που εκτελείτε βρίσκεται μέσα σε αυτή την εκχώρηση και μετά ελέγξτε ότι η διαδρομή της υπηρεσίας επιτρέπεται γι' αυτό. Μια έκδοση ανάπτυξης εγκατεστημένη έξω από την εκχώρηση μπορεί να βρίσκεται εντελώς έξω από το τούνελ και να μοιάζει με χαλασμένο API.
Μια σύγκριση στον περιηγητή δείχνει ότι κάποια εφαρμογή στη συσκευή έχει διαδρομή. Ποτέ δεν αποδεικνύει ότι τη δική σας έκδοση την έχει, γι' αυτό οι δύο δοκιμές πρέπει να γίνονται χωριστά.
Οι αποτυχίες εμπιστοσύνης αφορούν το όνομα στο πιστοποιητικό
NSURLErrorServerCertificateUntrusted μαζί με το σφάλμα TLS από κάτω σημαίνει ότι η αλυσίδα ή ο έλεγχος ταυτότητας απέτυχε. Ένα εσωτερικό CA πρέπει να είναι έμπιστο στη συσκευή, και ένα πιστοποιητικό που εκδόθηκε για άλλο όνομα κεντρικού υπολογιστή παραμένει λάθος μετά από οποιαδήποτε αναδιαμόρφωση δικτύου. ο οδηγός App Transport Security εξακολουθεί να ισχύει για αυτές τις συνδέσεις που φορτώνουν URL, και ένα τούνελ γύρω από μια απλή υπηρεσία HTTP δεν κάνει αυτή την υπηρεσία ασφαλή από άκρη σε άκρη.
Διορθώστε την ταυτότητα ή την άγκυρα εμπιστοσύνης και κρατήστε τη λίστα εξαιρέσεων κενή. Μια γενική εξαίρεση για αυθαίρετη φόρτωση κρύβει την αποτυχία κατά την ανάπτυξη και την αφήνει στη θέση της για κάθε χρήστη αργότερα.
Μια απόρριψη HTTP ανήκει στην εφαρμογή, όχι στο δίκτυο
Ένα 401 ή 403 μετά από ολοκληρωμένη χειραψία σημαίνει ότι το αίτημα έφτασε και η υπηρεσία το απέρριψε, οπότε το εναπομείναν ερώτημα είναι λογαριασμός, κοινό token, εύρος ή κλειδί. Καταγράψτε τον κωδικό κατάστασης και το όνομα κεντρικού υπολογιστή, ποτέ το bearer token ή το σώμα της απάντησης. Σε εκείνο το σημείο το τούνελ κάνει τη δουλειά του και περαιτέρω αλλαγές δικτύου απλώς καθυστερούν την πραγματική διόρθωση.
Ο πίνακας είναι η ταξινόμηση που κρατάτε δίπλα στο τερματικό: μία γραμμή ανά αποτυχία που μπορεί πραγματικά να αναφέρει η εφαρμογή. Εκτυπώστε τον κωδικό πριν τον διαβάσετε, γιατί η γραμμή που επιλέγετε καθορίζει σε ποια ενότητα θα δουλέψετε.
| 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 |
Κάθε γραμμή είναι φθηνότερη στη δοκιμή από την από κάτω της και κάθε μία αποκλείει διαφορετικό επίπεδο του ίδιου αιτήματος. Κατεβείτε τον πίνακα μέχρι να ταιριάξει μια γραμμή και μετά σταματήστε να αλλάζετε το δίκτυο.