Εγκαθιστάτε ένα προφίλ, το τούνελ σηκώνεται και όλα φαίνονται έτοιμα. Μετά το τηλέφωνο επανεκκινεί, το on-demand ξυπνά τη σύνδεση χωρίς εφαρμογή στο προσκήνιο, και το τούνελ αρνείται να ξεκινήσει. Το προφίλ είναι ακόμη εκεί και ο κωδικός είναι ακόμη σωστός, γι’ αυτό αυτή η αποτυχία στέλνει τους ανθρώπους να ψάχνουν στο λάθος μέρος. Ένα Network Extension δεν μπορεί να διαβάσει το μυστικό σας από το προφίλ: χρειάζεται μια αναφορά κλειδοθήκης που μπορεί να επιλύσει μόνο του.

Η παρακάτω διαδρομή ακολουθεί μία προσπάθεια σύνδεσης μέσα από αυτή την παράδοση, από το ερώτημα που χτίζει την αναφορά ως την επανεκκίνηση που τη δοκιμάζει.

Το προφίλ αποθηκεύει μια λαβή, όχι το μυστικό

Το NEVPNProtocol εκθέτει τα passwordReference και sharedSecretReference για έναν λόγο. Όταν ο δαίμονας ξεκινά ένα τούνελ, μπορεί να μην τρέχει μέσα στη διεργασία σας, άρα δεν μπορεί να καλέσει τον κώδικά σας και να ζητήσει κωδικό. Διαβάζει μια μόνιμη αναφορά κλειδοθήκης, την επιλύει στο δικό του περιβάλλον και φέρνει το στοιχείο μόνος του.

Χτίζετε αυτή την αναφορά ζητώντας την από την κλειδοθήκη, που είναι διαφορετικό αίτημα από το αίτημα για τα δεδομένα:

let query: [String: Any] = [
  kSecClass as String: kSecClassGenericPassword,
  kSecAttrService as String: "vpn-credentials",
  kSecAttrAccount as String: "user",
  kSecReturnPersistentRef as String: true,
  kSecMatchLimit as String: kSecMatchLimitOne
]

Δώστε το αντικείμενο που επιστρέφεται στο πρωτόκολλο, όχι τα δεδομένα του στοιχείου. Στην πράξη το προφίλ καταγράφει πού ζει το μυστικό, γι’ αυτό και ένα αντίγραφο ασφαλείας της διαμόρφωσης δεν αντιγράφει σιωπηλά τον κωδικό σε ένα plist.

Γιατί το API απαντά -50

Το errSecParam σημαίνει ότι το αίτημα ή η τιμή ήταν κακοσχηματισμένα για τη λειτουργία, και είναι το σφάλμα που βλέπετε συχνότερα όταν μπερδεύονται τα αιτήματα αναφοράς και δεδομένων. Το αίτημα για δεδομένα ενώ ο κώδικας υποδοχής περιμένει αναφορά, η ανάθεση ακατέργαστων byte στο passwordReference ή το ερώτημα με ομάδα πρόσβασης που η εφαρμογή δεν μπορεί να χρησιμοποιήσει, όλα το παράγουν.

Οι βιβλιοθήκες περιτυλίγματος το προσκαλούν. Ένας βοηθός που επιστρέφει byte δεν είναι ανταλλάξιμος με έναν που επιστρέφει αναφορά, οπότε η επισκευή είναι συνήθως διαφορετικό ερώτημα και όχι διαφορετικός κωδικός.

Η ίδια ασυμφωνία εξηγεί ένα προφίλ που αποθηκεύεται χωρίς παράπονο και μετά δεν συνδέεται: αυτό που αποθηκεύτηκε είναι ένα blob, όχι λαβή, και ο δαίμονας δεν έχει τίποτα να επιλύσει.

Αποθηκεύεται καλά, αποτυγχάνει στη σύνδεση

Η αποθήκευση ασκεί το περιβάλλον της εφαρμογής σας. Η σύνδεση ασκεί του δαίμονα, και τα δύο δεν έχουν την ίδια πρόσβαση. Ένα προφίλ μπορεί επομένως να περάσει κάθε δοκιμή στον εξομοιωτή και να αποτύχει στην πρώτη εκκίνηση on-demand.

Αυτό είναι και το σχήμα του συμπτώματος της επανεκκίνησης: δουλεύει όσο η εφαρμογή είναι ανοιχτή και πεθαίνει όταν το σύστημα ξεκινά το τούνελ μόνο του.

Δοκιμάστε σκόπιμα τη διαδρομή υποβάθρου πριν την κυκλοφορία. Πυροδοτήστε μια σύνδεση on-demand με την εφαρμογή κλειστή και μετά διαβάστε την κονσόλα της συσκευής και όχι το αρχείο καταγραφής της εφαρμογής, γιατί η αποτυχία καταγράφεται από τη διεργασία που προσπάθησε να επιλύσει την αναφορά. Αν η κονσόλα δείχνει ότι ο δαίμονας απορρίπτει το στοιχείο, η αναφορά είναι εντάξει και το πρόβλημα είναι η προσβασιμότητα του στοιχείου.

Η προσβασιμότητα καθορίζει αν μια επανεκκίνηση δουλεύει

Το στοιχείο πρέπει να είναι αναγνώσιμο από όποια διεργασία συστήματος ξεκινά το τούνελ, και αυτό είναι ευρύτερο κοινό από την εφαρμογή σας όσο βρίσκεται στο προσκήνιο. Αυτός ο περιορισμός διαλέγει το χαρακτηριστικό προσβασιμότητας για σας. Ένα στοιχείο που προστατεύεται ως το πρώτο ξεκλείδωμα είναι διαθέσιμο σε εκκίνηση υποβάθρου αφού η συσκευή ξεκλειδωθεί μία φορά· ένα στοιχείο που απαιτεί η συσκευή να είναι ξεκλείδωτη τώρα δεν είναι.

Η επιλογή της αυστηρότερης κλάσης είναι δελεαστική και είναι ακριβώς αυτό που σπάει ένα προφίλ on-demand σε κλειδωμένο τηλέφωνο.

Αφού αλλάξετε κλάση, δημιουργήστε ξανά το στοιχείο αντί να επεξεργαστείτε χαρακτηριστικά στο υπάρχον, και μετά αποθηκεύστε ξανά το πρωτόκολλο με φρέσκια αναφορά. Οι αλλαγές χαρακτηριστικών σε υπάρχον στοιχείο δεν παράγουν πάντα τη συμπεριφορά που υπονοεί η τεκμηρίωση, και ένα ξαναχτισμένο στοιχείο αφαιρεί την αμφιβολία.

Η περιστροφή είναι εκεί όπου σαπίζουν τα αποθηκευμένα προφίλ

Η αλλαγή του κωδικού στην κλειδοθήκη δεν αλλάζει αυτόματα το πού δείχνει το αποθηκευμένο προφίλ. Η διαγραφή του στοιχείου είναι χειρότερη: το προφίλ κρατά αναφορά σε κάτι που δεν υπάρχει πια, και η αποτυχία μοιάζει με απόρριψη ταυτοποίησης.

Κάντε περιστροφή με μία σειρά. Ενημερώστε το στοιχείο, ζητήστε νέα μόνιμη αναφορά, αποθηκεύστε ξανά το πρωτόκολλο και μετά συνδεθείτε με κλειστή εφαρμογή για να αποδείξετε ότι ο δαίμονας μπορεί ακόμη να την επιλύσει. Κρατήστε τον κωδικό χρήστη και το κοινό μυστικό σε ξεχωριστά στοιχεία ώστε το καθένα να περιστρέφεται με το δικό του πρόγραμμα, και μην καταγράφετε ποτέ το λεξικό του ερωτήματος ούτε την ίδια την αναφορά. Η λαβή δεν είναι μυστικό, αλλά είναι χάρτης προς ένα.

Σχετικά άρθρα