Μια εκτέλεση έκδοσης σταματά με entry 22: invalid expiry date, και το αίτημα μπροστά σας είναι απολύτως εντάξει. Η διαμαρτυρία προέρχεται από τον αναλυτή της βάσης δεδομένων της CA, όχι από το CSR και όχι από τον πελάτη VPN που θα παρουσιάσει τελικά το πιστοποιητικό. Αυτή η διάκριση καθορίζει όλα όσα ακολουθούν: μια εγγραφή είναι παραμορφωμένη, άρα η επισκευή ανήκει στην κατάσταση της CA και όχι στο αίτημα ή στη διαμόρφωση του ομοτίμου. Αντιμετωπίστε την αριθμημένη εγγραφή ως γραμμή στο index.txt, και το πρόβλημα συρρικνώνεται σε ένα οριοθετημένο ερώτημα δεδομένων με απάντηση που ελέγχεται.

Διαβάστε το σφάλμα ως διαμαρτυρία για τη βάση δεδομένων

Κάθε openssl ca κλήση διατρέχει την έγγραφη βάση της πριν υπογράψει οτιδήποτε. Κάθε γραμμή περιέχει ένα γράμμα κατάστασης, μια χρονική σφραγίδα λήξης, προαιρετική σφραγίδα ανάκλησης, σειριακό αριθμό σε δεκαεξαδικό, όνομα αρχείου και το υποκείμενο. Όταν ένα πεδίο δεν αναλύεται, η εντολή αναφέρει τον αριθμό γραμμής και σταματά αντί να μαντεύει το υπόλοιπο της εγγραφής.

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

Αντιγράψτε την κατάσταση της CA πριν αγγίξετε οτιδήποτε

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

Καταγράψτε την έκδοση του OpenSSL και το αρχείο διαμόρφωσης που φόρτωσε πραγματικά η αποτυχημένη εντολή. Οι εγκαταστάσεις συχνά κρατούν περισσότερους από έναν καταλόγους CA, και το σφάλμα αποκτά νόημα μόνο σε σχέση με τη βάση που ονομάζει η επιλεγμένη διαμόρφωση.

Βρείτε την εγγραφή και αποκωδικοποιήστε το πεδίο ημερομηνίας της

Ο αναφερόμενος αριθμός γραμμής μετράει από την πρώτη εγγραφή, οπότε το sed -n '22p' index.txt προσγειώνεται στην προβληματική εγγραφή αφού επιβεβαιώσετε ότι δεν υπάρχουν κενές γραμμές ή σχόλια πάνω από αυτήν. Εκτυπώστε τη γραμμή με ορατούς διαχωριστές, γιατί οι στηλοθέτες και τα κενά στο τέλος είναι συνηθισμένα και αόρατα σε ένα συνηθισμένο παράθυρο επεξεργαστή.

Το πεδίο λήξης είναι μια χρονική σφραγίδα της οποίας το πλάτος εξαρτάται από το έτος. Οι τιμές μέχρι το 2049 γράφονται σε UTCTime ως YYMMDDHHMMSSZ, ενώ οι μεταγενέστερες τιμές περνούν σε GeneralizedTime με τετραψήφιο έτος. Μια εγγραφή που αναμειγνύει τις δύο μορφές, ή που φέρει διψήφιο έτος εκεί όπου ο αναλυτής περιμένει τώρα τέσσερα, αποτυγχάνει ακριβώς σε αυτό το σημείο. Το ίδιο και ένα κολοβωμένο πεδίο που άφησε μια διακοπείσα εγγραφή.

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

Επισκευάστε την εγγραφή με βάση το υπογεγραμμένο πιστοποιητικό

Διαβάστε τις πραγματικές ημερομηνίες με openssl x509 -in issued.pem -noout -dates -serial -subject. Μετατρέψτε το notAfter στο πλάτος σφραγίδας που γράφει η δική σας έκδοση για εκείνο το έτος, και επιβεβαιώστε ότι ο σειριακός αριθμός ταιριάζει με την εγγραφή που πρόκειται να επεξεργαστείτε πριν αλλάξετε έναν χαρακτήρα.

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

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

Επαληθεύστε την έκδοση και την παραγωγή CRL πριν φύγετε

Εκτελέστε μία έκδοση με την ίδια διαμόρφωση και επιβεβαιώστε ότι ολοκληρώνεται χωρίς παράπονο για αριθμό γραμμής. Έπειτα δημιουργήστε μια CRL με openssl ca -gencrl -config openssl.cnf και ελέγξτε ότι αναλύεται, γιατί μια κατεστραμμένη εγγραφή συχνά εμφανίζεται εκεί και όχι κατά την υπογραφή.

Επιθεωρήστε το νέο πιστοποιητικό με openssl x509 -noout -dates -serial και συγκρίνετέ το με τη γραμμή που μόλις έγραψε η CA. Επιβεβαιώστε ότι το γράμμα κατάστασης και η ημερομηνία λήξης συμφωνούν με το πιστοποιητικό, και επιβεβαιώστε ότι openssl verify -CAfile ca.pem issued.pem επιστρέφει χωρίς σφάλμα. Έπειτα επαναφέρετε την προγραμματισμένη έκδοση και παρακολουθήστε την πρώτη εκτέλεση, γιατί μια δεύτερη παραμορφωμένη γραμμή θα ανακοινωθεί αμέσως.

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