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

Ο μύθος: ο επεξεργαστής σάς δείχνει το αρχείο

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

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

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

Τι λένε πραγματικά τα πρώτα byte

Διαβάστε τα byte αντί για τους χαρακτήρες. Δύο μικρές εντολές το ξεκαθαρίζουν σε δευτερόλεπτα και καμία από τις δύο δεν απαιτεί να ανοίξετε το αρχείο σε μια εφαρμογή που μπορεί να το αλλάξει:

file client.ovpn
head -c 24 client.ovpn | od -An -tx1

Το μοτίβο που ψάχνετε είναι ένα ζεύγος αρχικών byte που ακολουθείται από κείμενο όπου κάθε δεύτερο byte είναι μηδέν. Το FF FE δηλώνει UTF-16 little-endian, το FE FF δηλώνει big-endian και το EF BB BF δηλώνει UTF-8 με σήμα σειράς byte. Ένα απλό αρχείο UTF-8 χωρίς σήμα ξεκινά κατευθείαν με το byte του πρώτου γράμματος.

Τα μηδενικά byte ανάμεσα στα γράμματα είναι το στοιχείο που προδίδει. Σε UTF-16 little-endian η λέξη client καταλαμβάνει δώδεκα byte αντί για έξι, επειδή κάθε χαρακτήρας ASCII ακολουθείται από ένα μηδέν. Αυτή η δομή δεν είναι κάτι που μπορεί να σας δείξει η οθόνη ενός επεξεργαστή και δεν είναι κάτι που μπορεί να αφαιρέσει μια διαγραφή δύο byte.

Εδώ υπάρχει μια σημαντική λεπτομέρεια: ο αναγνώστης διαμόρφωσης του OpenVPN παραλείπει πράγματι ένα σήμα σειράς byte UTF-8 στην αρχή ενός αρχείου, όπως δείχνει ο αναγνώστης διαμόρφωσης 2.6. Αυτή η ανοχή αφορά ειδικά εκείνο το σήμα και δεν κάνει τίποτα για ένα αρχείο UTF-16 του οποίου τα γράμματα είναι γεμισμένα με μηδενικά. Το να αντιμετωπίζετε τα δύο σήματα ως το ίδιο πρόβλημα είναι το δεύτερο μισό του μύθου.

Η μετατροπή είναι αποθήκευση ως, όχι διαγραφή

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

Στη συνέχεια εκτελέστε μια πραγματική μετατροπή κωδικοποίησης, είτε μέσω του ρητού μενού κωδικοποίησης του επεξεργαστή είτε με έναν μετατροπέα που δηλώνει την κωδικοποίηση εισόδου και εξόδου:

iconv -f UTF-16 -t UTF-8 client.ovpn > client-utf8.ovpn
file client-utf8.ovpn

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

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

Τι δεν διορθώνει μια διορθωμένη κωδικοποίηση

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

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

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

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