Μια έξυπνη κάρτα που κρατά ήδη το σωστό κλειδί πρέπει παρ’ όλα αυτά να μάθει ποιο αντικείμενο πάνω της να χρησιμοποιήσει. Το OpenConnect δεν θέλει ένα αντιγραμμένο αρχείο .key σε αυτή την περίπτωση· θέλει ένα URI PKCS#11 που ονομάζει το πιστοποιητικό και, όταν η αυτόματη αναζήτηση δεν μπορεί να ολοκληρώσει τη δουλειά, το ιδιωτικό κλειδί δίπλα του. Το δύσκολο σημείο είναι ότι ένα συντακτικά έγκυρο URI δεν αποδεικνύει τίποτα. Πρέπει να ονομάζει την εγγραφή που η πύλη εμπιστεύεται ήδη, όχι απλώς ένα αντικείμενο που η κάρτα δέχεται να ανοίξει.

Τι θέλει ο πελάτης αντί για ένα εξαγόμενο κλειδί

Η επιλογή -c συνήθως δέχεται μια διαδρομή αρχείου, αλλά όταν η τιμή αναλύεται ως URI PKCS#11, το OpenConnect τη μεταχειρίζεται ως αναφορά σε αντικείμενο μέσα στο token και όχι σε αρχείο στον δίσκο. Η επιλογή -k συμπεριφέρεται με τον ίδιο τρόπο για το ιδιωτικό κλειδί. Τίποτα δεν εξάγεται και το κλειδί δεν εγκαταλείπει ποτέ την προστασία που παρέχει η κάρτα. Αυτό που χρειάζεται ο πελάτης από εσάς είναι ένα όνομα στο οποίο συμφωνούν η μονάδα του token, το αποθηκευτικό πιστοποιητικών και η εγγραφή στην πύλη.

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

Δύο URI, δύο διαφορετικές δουλειές

Το URI του πιστοποιητικού απαντά ποια ταυτότητα διεκδικείτε. Δείχνει σε ένα αντικείμενο πιστοποιητικού του οποίου το δημόσιο κλειδί και η γραμμή υποκειμένου ταιριάζουν με το προφίλ λογαριασμού ή συσκευής που εξέδωσε ο διαχειριστής VPN. Το ίδιο πιστοποιητικό συνήθως έρχεται με ένα αντικείμενο ιδιωτικού κλειδιού αποθηκευμένο δίπλα του, και αυτό το ζεύγος χρειάζεται στην πραγματικότητα η χειραψία TLS.

Το URI του κλειδιού απαντά πού ζει το αντίστοιχο ιδιωτικό υλικό όταν το OpenConnect δεν μπορεί να το συμπεράνει. Με μόνο το -c ορισμένο, ο πελάτης χτίζει μια αναζήτηση κλειδιού από τις ιδιότητες του πιστοποιητικού· η παροχή του -k αντικαθιστά την εικασία με ρητή αναφορά αντικειμένου. Το PIN του token είναι μια τρίτη, άσχετη είσοδος: ξεκλειδώνει την κάρτα για τη λειτουργία και δεν ταυτοποιεί ποτέ ένα αντικείμενο.

openconnect --protocol=anyconnect \
  -c 'pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=1a2b3c4d;id=%01' \
  vpn.example.net

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

Βρίσκοντας το URI που ταιριάζει με την εγγραφή σας

Το GnuTLS παρέχει το p11tool, το οποίο απαριθμεί τι μπορεί πραγματικά να προσεγγίσει ο τρέχων χρήστης μέσω του p11-kit. Ξεκινήστε με p11tool --list-tokens και μετά απαριθμήστε τα αντικείμενα πιστοποιητικών στο token που σας ενδιαφέρει. Προσθέστε --login όταν τα αντικείμενα εμφανίζονται μόνο μετά από PIN, και συγκρίνετε το υποκείμενο και τον εκδότη με το αρχείο εγγραφής αντί να διαλέξετε ό,τι εμφανιστεί πρώτο.

Αν το token δεν εμφανίζεται καθόλου, το πρόβλημα βρίσκεται κάτω από το OpenConnect: το p11-kit δεν έχει καταχωρισμένη μονάδα για αυτό το middleware, ή η μονάδα είναι καταχωρισμένη για άλλον λογαριασμό. Η καταχώριση σε επίπεδο συστήματος βρίσκεται στο /etc/pkcs11/modules, και ένας κατάλογος ανά χρήστη μπορεί να περιέχει το ίδιο χωρίς να αγγίξει το αντίγραφο του συστήματος. Ελέγξτε ότι η διαδρομή παρόχου στο αρχείο της μονάδας δείχνει σε βιβλιοθήκη που το λογισμικό του αναγνώστη εγκατέστησε πράγματι.

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

Όταν η αυτόματη αναζήτηση κλειδιού τα παρατά

Το OpenConnect μπορεί να παράγει μια αναζήτηση κλειδιού από το URI του πιστοποιητικού, αλλά η ακριβής αντιστοίχιση που εκτελεί εξαρτάται από την έκδοση, και ο χειρισμός του τύπου αντικειμένου και της ετικέτας έχει αλλάξει με τον χρόνο. Η συμβουλή να συντομεύετε το URI μέχρι να δουλέψει περιγράφει μια παλιά παράκαμψη, όχι μια απαίτηση. Αν η παράγωγη αναζήτηση αποτύχει, ονομάστε το κλειδί ρητά με -k αντί να μετατρέψετε το URI του πιστοποιητικού σε κάτι αοριστότερο.

Επιβεβαιώστε ότι το κλειδί υπάρχει και είναι ορατό με p11tool --list-keys πριν κατηγορήσετε τον πελάτη. Μετά ελέγξτε ότι το αντικείμενο είναι σημασμένο ως χρησιμοποιήσιμο για υπογραφή ή αποκρυπτογράφηση, γιατί ένα κλειδί που δημιουργήθηκε με λάθος χαρακτηριστικά δεν μπορεί να ολοκληρώσει χειραψία, όσο σωστό κι αν είναι το URI. Μην μεταφέρετε μια σειριοποιημένη τιμή pkcs11-id από προφίλ OpenVPN σε επιλογή OpenConnect· οι δύο πελάτες χρησιμοποιούν διαφορετικές μορφές αναγνωριστικού ακόμη και όταν μιλούν στην ίδια κάρτα.

Αν το URI επιλύεται και το PIN γίνεται δεκτό αλλά η πιστοποίηση εξακολουθεί να αποτυγχάνει, σταματήστε να ρυθμίζετε το URI. Διαβάστε το σφάλμα της ίδιας της πύλης, γιατί η επόμενη αποτυχία είναι πάνω από το token.

Αποτυχίες που μοιάζουν μόνο με προβλήματα URI

Μια πύλη που μιλά διαφορετικό πρωτόκολλο θα αποτύχει το ίδιο είτε το URI σας είναι σωστό είτε λάθος. Το OpenConnect αντικατέστησε τον παλιό πελάτη vpnc για κάποιον λόγο, και η υποστήριξη καρτών δεν κάνει συμβατό ένα ασύμβατο πρωτόκολλο πύλης. Επιβεβαιώστε το αναμενόμενο πρωτόκολλο του διακομιστή και τη διάταξη πιστοποίησης πριν ξοδέψετε άλλη μια ώρα σε χαρακτηριστικά αντικειμένου.

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

Δουλέψτε προς τα έξω από το αντικείμενο: βλέπει το p11tool το token, βλέπει το πιστοποιητικό και το κλειδί, δέχεται το OpenConnect το URI, και μόνο τότε ρωτήστε αν η πύλη δέχεται την ταυτότητα. Κάθε βήμα έχει το δικό του μήνυμα σφάλματος, και το καθένα είναι φθηνότερο να δοκιμαστεί από το επόμενο.

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