OpenVPN atmeta pirmą eilutę? Failas greičiausiai yra UTF-16
Klaida pirmoje eilutėje su keistais simboliais dažniausiai reiškia, kad profilis išsaugotas kaip UTF-16. Perskaitykite pirmuosius baitus ir tada tinkamai konvertuokite failą.
Klaida nurodo pirmą .ovpn failo eilutę ir cituoja kažką, kas atrodo kaip sumaišytos raidės ten, kur turėtų būti client. Failas jūsų redaktoriuje atsidaro be problemų, pirmoji eilutė skaitoma client, o direktyva visiškai įprasta. Abu pastebėjimai teisingi, nes redaktorius dekoduoja baitus, o klientas to nedaro. Tai, ką matote, beveik visada yra kodavimo problema, o ne sintaksės problema.
Mitas: redaktorius jums parodo failą
Teksto redaktorius dekoduoja baitus į simbolius naudodamas kodavimą, kurį arba aptinka, arba atspėja. Kai jis atspėja UTF-16, failas ekrane atrodo nepriekaištingai, nors po juo esantys baitai yra poros, po kiekvienos lotyniškos raidės eina nulinis baitas. OpenVPN tuos baitus skaito kaip simbolius, ir neatitikimas pasirodo pirmoje direktyvoje, kurią jis bando išanalizuoti.
Taigi matoma eilutė ir pateikta eilutė yra du skirtingi dalykai. Matomų keistų simbolių trynimas yra rodymo, o ne kodavimo pakeitimas, ir kita analizė nepavyksta dėl tos pačios priežasties su šiek tiek kitokiu pranešimu. Štai kodėl klaidos ženklo persekiojimas niekada niekur neveda. Baitai yra neteisingi šaltinyje, ir kiekvienas tolesnis skaitytojas spėja tą pačią sugadintą seką.
Šios nesėkmės konkrečią formą verta atpažinti, nes ji tam tikru būdu yra diagnostinė. Ženklas pačioje failo pradžioje, profilyje, kuris kitu atveju veikė kitose mašinose, yra baitų tvarkos, o ne žodyno klausimas.
Ką iš tikrųjų sako pirmieji baitai
Skaitykite baitus, o ne simbolius. Dvi mažos komandos tai išsprendžia per sekundes, ir nė viena nereikalauja atidaryti failo programoje, kuri galėtų jį pakeisti:
file client.ovpn
head -c 24 client.ovpn | od -An -tx1
Šablonas, kurio ieškote, yra pora pradinių baitų, po kurių eina tekstas, kuriame kas antras baitas yra nulis. FF FE žymi UTF-16 little-endian, FE FF žymi big-endian, o EF BB BF žymi UTF-8 su baitų tvarkos žyme. Paprastas UTF-8 failas be žymės prasideda tiesiogiai nuo pirmosios raidės baito.
Nuliniai baitai tarp raidžių yra pagrindinė užuomina. UTF-16 little-endian atveju žodis client užima dvylika baitų, o ne šešis, nes po kiekvieno ASCII simbolio eina nulis. Tokios struktūros redaktoriaus ekranas jums parodyti negali, o dviejų baitų trynimas jos nepanaikins.
Čia yra svarbus niuansas: OpenVPN konfigūracijos skaitytuvas tikrai praleidžia UTF-8 baitų tvarkos žymę failo pradžioje, kaip rodo 2.6 konfigūracijos skaitytuvas. Ta tolerancija skirta būtent tai žymei ir nieko nedaro UTF-16 failui, kurio raidės užpildytos nuliais. Abiejų žymių laikymas ta pačia problema yra antroji mito pusė.
Konvertavimas yra išsaugojimas kaip, o ne trynimas
Prieš ką nors darydami išsaugokite nepaliestą operatoriaus originalo kopiją ir dirbkite su atskiru failu. Profilyje gali būti privatus raktas arba paskyros duomenys, todėl kopija yra ir jūsų atsarginė versija, ir nuoroda.
Tada atlikite tikrą kodavimo konvertavimą: arba per aiškų redaktoriaus kodavimo meniu, arba su konverteriu, kuris nurodo įvesties ir išvesties kodavimą:
iconv -f UTF-16 -t UTF-8 client.ovpn > client-utf8.ovpn
file client-utf8.ovpn
Patikrinkite rezultatą, o ne pasikliaukite komandos išėjimo būsena. Konvertavimas turėtų išsaugoti kiekvieną direktyvą ir privalo išsaugoti bet kurį įterptą sertifikato ar rakto bloką baitas po baito jo žymėse. PEM duomenų pervyniojimas, eilutės pabaigų keitimas bloko viduje arba profilio performatavimas konvertavimo metu sukuria naują problemą, kol taisoma sena.
Nukreipkite klientą ar paslaugą į konvertuotą failą ir pažiūrėkite į pirmą praneštą klaidą. Jei sumaišytas ženklas dingo, kodavimo darbas baigtas, o visa, kas nepavyksta po to, yra kitas klausimas.
Ko sutvarkytas kodavimas nesutvarko
Kodavimas lemia, kaip tekstas skaitomas; jis nieko nesako apie tai, ar parinktys galioja priešais esančiam klientui. Profilis, eksportuotas kitai implementacijai, gali būti švariai išanalizuotas ir vis tiek atmestas dėl parinkties, kurios veikiantis rinkinys nepalaiko, arba dėl direktyvos, kurios argumentas tame kliente reiškia kažką kita.
Tos vėlesnės klaidos nusipelno atskiro tyrimo: tikslios rašybos, argumento sintaksės ir versijos, kuri ją priima. Nelaikykite sėkmingos analizės sėkmingu profiliu.
Tyrime laikykitės vietinės aplinkos. Vieši internetiniai konverteriai ir įklijuoti hex išrašai yra bloga vieta failui, kuriame gali būti privatus raktas, nes kodavimo problemą sutvarkyti lengva, o nutekinto rakto – ne.