Αντιστοίχιση πιστοποιητικού & ιδιωτικού κλειδιού

Επικόλληση του πιστοποιητικού που χρησιμοποιεί ένας διακομιστής και του ιδιωτικού κλειδιού που πρόκειται να αναπτυχθεί μαζί του, και η σελίδα απαντά στο ερώτημα όπου αποτυγχάνει ένας αναπτυγμένος ιστότοπος: προέρχονται τα δύο από το ίδιο ζεύγος κλειδιών; Η απάντηση δεν είναι εικασία από μήκη modulus ή μόνο από αποτυπώματα — η σελίδα υπογράφει μια σταθερή πρόκληση με το ιδιωτικό κλειδί και επαληθεύει την υπογραφή με το δημόσιο κλειδί μέσα στο πιστοποιητικό. Αν η επαλήθευση περάσει, τα δύο ανήκουν μαζί· αν αποτύχει, καμία επεξεργασία της διαμόρφωσης δεν θα τα κάνει να λειτουργήσουν. Και οι δύο αναγνώσεις εμφανίζονται δίπλα-δίπλα με τον αλγόριθμο, το μέγεθος κλειδιού, το αναγνωριστικό κλειδιού θέματος και το αποτύπωμα δημόσιου κλειδιού, και τίποτα από όσα επικολλώνται δεν φεύγει από το πρόγραμμα περιήγησης.
1. Πιστοποιητικό ή αλυσίδα
Επικόλληση όσων μπλοκ επιθυμείται. Κάθε πιστοποιητικό ελέγχεται έναντι κάθε κλειδιού, οπότε μια αλυσίδα συν ένα κλειδί δείχνει ακριβώς σε ποιο πιστοποιητικό της αλυσίδας ανήκει εκείνο το κλειδί — μια συνηθισμένη έκπληξη σε διακομιστή που σερβίρει λάθος πιστοποιητικό από ένα πακέτο. Διαβάζονται PEM, γυμνό base64 ή σώμα δεκαεξαδικών, καθώς και αρχείο PKCS#7 .p7b· ο έλεγχος πιστοποιητικού ελέγχει το ίδιο το πιστοποιητικό αφού το κλειδί έχει οριστεί.
2. Ιδιωτικό κλειδί ή δημόσιο κλειδί
Γίνονται κατανοητά τα PKCS#8 (BEGIN PRIVATE KEY), PKCS#1 (BEGIN RSA PRIVATE KEY), SEC1 (BEGIN EC PRIVATE KEY) και ένα γυμνό δημόσιο κλειδί SPKI (BEGIN PUBLIC KEY), όπως και ένα αρχείο κλειδιού επικολλημένο ως base64 ή δεκαεξαδικά. Ένα κρυπτογραφημένο κλειδί PKCS#8 (BEGIN ENCRYPTED PRIVATE KEY) δεν μπορεί να διαβαστεί από πρόγραμμα περιήγησης και αναφέρεται ως τέτοιο, με την εντολή που αφαιρεί τη φράση πρόσβασης.
δεν έχει ελεγχθεί τίποτα ακόμη
Το δείγμα είναι ένα αυτο-υπογεγραμμένο πιστοποιητικό και το ιδιωτικό κλειδί που του ανήκει, και τα δύο φτιαγμένα για αυτή τη σελίδα και χωρίς να προστατεύουν τίποτα. Για να φανεί η άλλη ετυμηγορία, αντικαθίσταται το κλειδί με οποιοδήποτε άλλο κλειδί, ή αντί για το ιδιωτικό τοποθετείται το μπλοκ του δημόσιου κλειδιού για να φανεί η αντιστοίχιση δημόσιου κλειδιού.
Ένα ιδιωτικό κλειδί που επικολλάται σε οποιαδήποτε ιστοσελίδα αξίζει πρώτα μια δεύτερη σκέψη. Η σελίδα αυτή είναι ένα αρχείο απλής JavaScript, δεν φορτώνει τίποτα από πουθενά και δεν κάνει κανένα αίτημα, οπότε το κλειδί διαβάζεται, χρησιμοποιείται και ξεχνιέται μέσα σε αυτή την καρτέλα. Αυτό είναι ακόμη μια υπόσχεση που δίνει κώδικας που μπορεί να διαβαστεί, και όχι εγγύηση από δίκτυο που μπορεί να παρατηρηθεί: αν πρόκειται για κλειδί παραγωγής, να δουλεύεται εκτός σύνδεσης, και να θεωρείται ότι ο ασφαλέστερος έλεγχος είναι η ίδια εντολή openssl στον ίδιο διακομιστή της υπηρεσίας. Ένα κλειδί που επικολλάται εδώ δεν αποθηκεύεται ποτέ, δεν μπαίνει ποτέ σε αρχείο και δεν αποστέλλεται ποτέ πουθενά — συμπεριλαμβανομένων των κουμπιών εξαγωγής, που γράφουν ευρήματα για το κλειδί και ποτέ το ίδιο το κλειδί.
Γιατί η υπογραφή είναι η απάντηση. Δύο αρχεία μπορεί να μοιάζουν και να μην ταιριάζουν: τα RSA κλειδιά συγκρίνονται κατά modulus στους περισσότερους οδηγούς, αλλά αυτό ισχύει μόνο για RSA, και ένα κλειδί μπορεί να φέρει το σωστό modulus με κατεστραμμένο εκθέτη ή λάθος padding. Αυτή η σελίδα αποδεικνύει το ζεύγος με τον τρόπο που το κάνει μια χειραψία — υπογράφει μια σταθερή πρόκληση με το ιδιωτικό κλειδί και την επαληθεύει με το δημόσιο κλειδί του πιστοποιητικού — οπότε η ετυμηγορία ισχύει εξίσου για RSA, ECDSA και Ed25519. Όταν επικολλάται μόνο το δημόσιο μισό, συγκρίνονται τα ίδια τα bytes του δημόσιου κλειδιού με εκείνα του πιστοποιητικού, που είναι εξίσου αποδεικτικό ως προς την ταυτότητα, απλώς χωρίς απόδειξη ότι κάποιος κατέχει το ιδιωτικό μισό.

Τι δεν λέει μια αντιστοιχία. Δεν λέει ότι το κλειδί είναι αυτό που φορτώνει πράγματι ο διακομιστής, ότι το πιστοποιητικό είναι αξιόπιστο, ότι το αρχείο κλειδιού είναι άθικτο στον δίσκο, ή ότι κάποιος άλλος δεν το αντέγραψε. Επίσης δεν μπορεί να πει αν το πιστοποιητικό είναι αυτό που θα λάβει ένας πελάτης, αφού ένας load balancer ή ένα CDN μπροστά από τον ιστότοπο μπορεί να σερβίρει άλλο. Για να ελεγχθεί τι παρουσιάζει πράγματι ένας ζωντανός διακομιστής, εκτελείται openssl s_client -connect example.com:443 -servername example.com -showcerts και η έξοδός του επικολλάται στο πλαίσιο πιστοποιητικού.

Από πού προέρχονται τα αρχεία. Το πιστοποιητικό είναι ό,τι έχει ρυθμιστεί στον διακομιστή, ή αυτό που εξάγεται από πρόγραμμα περιήγησης ή προκύπτει από ένα πακέτο .p7b. Το ιδιωτικό κλειδί είναι το αρχείο που διαβάζει ο διακομιστής ιστού κατά την εκκίνηση, συνήθως κάτι σαν privkey.pem ή server.key. Αν το κλειδί είναι κρυπτογραφημένο, πρώτα αποκρυπτογραφείται ένα αντίγραφο με openssl pkcs8 -topk8 -nocrypt -in key.pem -out key-plain.pem, επικολλάται αυτό, και το αντίγραφο διαγράφεται.
Δεν έχει ελεγχθεί τίποτα ακόμη. Επικόλληση πιστοποιητικού και κλειδιού παραπάνω και εκτέλεση του Έλεγχος αν ταιριάζουν. Η ετυμηγορία εμφανίζεται εδώ με τα στοιχεία που τη στηρίζουν, και η αναφορά μπορεί να αντιγραφεί ή να αποθηκευτεί.
Ο ίδιος έλεγχος με openssl, σε τοπικό υπολογιστή
# δημόσιο κλειδί μέσα στο πιστοποιητικό openssl x509 -in cert.pem -noout -pubkey | openssl pkey -pubin -outform DER | openssl sha256 # δημόσιο κλειδί μέσα στο ιδιωτικό κλειδί openssl pkey -in key.pem -pubout | openssl pkey -pubin -outform DER | openssl sha256 # τα δύο αποτυπώματα είναι ίσα μόνο όταν το ζεύγος ανήκει μαζί # ο παλαιός τρόπος μόνο για RSA: σύγκριση modulus openssl x509 -in cert.pem -noout -modulus | openssl md5 openssl rsa -in key.pem -noout -modulus | openssl md5
Η σύγκριση αποτυπωμάτων λειτουργεί για κάθε τύπο κλειδιού και ταιριάζει με όσα αναφέρει αυτή η σελίδα ως αποτύπωμα δημόσιου κλειδιού, ενώ η σύγκριση modulus υπάρχει μόνο για RSA. Καμία από τις δύο δεν αποδεικνύει ότι κάποιος κατέχει το ιδιωτικό μισό — αυτό το κάνει ο έλεγχος υπογραφής παραπάνω, γι' αυτό χρησιμοποιείται από τη σελίδα.
Τι περιέχει η αναφορά. Η ετυμηγορία, το ζεύγος των αναγνώσεων από τις οποίες προήλθε (αλγόριθμος, μέγεθος κλειδιού, καμπύλη, αναγνωριστικό κλειδιού θέματος και αποτύπωμα δημόσιου κλειδιού, για το πιστοποιητικό και για το κλειδί), και ο ακριβής έλεγχος που εκτελέστηκε. Η αναφορά δεν περιέχει ποτέ το ίδιο το ιδιωτικό κλειδί: το κλειδί χρησιμοποιείται για την παραγωγή υπογραφής και δεν γράφεται στο κείμενο, στο JSON ή στο πρόχειρο. Ό,τι αντιγράφεται ή αποθηκεύεται μπορεί να επισυναφθεί σε αίτημα υποστήριξης· το κλειδί που επικολλήθηκε δεν μπορεί, και το πρόχειρο είναι ο μόνος άλλος χώρος όπου υπήρξε ποτέ.

Απόρρητο: το πιστοποιητικό και το κλειδί διαβάζονται μέσα στην καρτέλα, δεν μεταφορτώνονται, και η σελίδα δεν κάνει κανένα αίτημα — δεν υπάρχει έλεγχος ή αναζήτηση στη σελίδα. Για τη δημιουργία ζεύγους που ταιριάζει χρησιμοποιείται η γεννήτρια αυτο-υπογεγραμμένων πιστοποιητικών· για αίτηση πιστοποιητικού για κλειδί που ήδη υπάρχει χρησιμοποιείται η γεννήτρια CSR· για ανάγνωση του περιεχομένου πιστοποιητικού χρησιμοποιείται ο αποκωδικοποιητής πιστοποιητικών.