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

Τι πρέπει πραγματικά να είναι το αρχείο στον δίσκο

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

Ο ίδιος τύπος αντικειμένου εξυπηρετεί και τις δύο λειτουργίες του καναλιού ελέγχου. Με το tls-auth, κάθε peer χρειάζεται επίσης μια κατεύθυνση ώστε τα πακέτα της μίας πλευράς να μην μπορούν να ανακλαστούν πίσω σε αυτήν. Με το tls-crypt, ένα μόνο κοινό μυστικό κρυπτογραφεί και πιστοποιεί το κανάλι ελέγχου και προς τις δύο κατευθύνσεις, κάτι που κρύβει τη χειραψία καθώς και την προστατεύει.

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

Ο υποστηριζόμενος τρόπος να φτιάξεις ένα

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

openvpn --genkey secret /etc/openvpn/tc-shared.key
tls-crypt /etc/openvpn/tc-shared.key

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

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

openvpn --genkey tls-crypt-v2-server /etc/openvpn/tc-v2-server.key
openvpn --genkey tls-crypt-v2-client /etc/openvpn/laptop1.key --tls-crypt-v2 /etc/openvpn/tc-v2-server.key

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

Πού καταρρέουν τα χειροποίητα bytes

Η εκτύπωση 256 τυχαίων bytes ως hex κάτω από μια σωστή κεφαλίδα θα έδινε, θεωρητικά, ένα αρχείο στατικού κλειδιού που φορτώνει. Παραμένει κακή ιδέα. Κάθε λεπτομέρεια μορφοποίησης γίνεται μια ευκαιρία να παραχθεί υλικό που αποτυγχάνει κατά τη φόρτωση ή, χειρότερα, αφήνει δύο peers με διαφορετικές τιμές που αποκαλύπτονται μόνο ως αποτυχία πιστοποίησης.

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

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

Εναλλαγή χωρίς να κλειδώσεις όλους έξω

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

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

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

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