OpenSSL უკვე დაყენებულია, ჰოსტს ენტროპია აქვს და მისით გასაღების შექმნა აშკარა მოკლე გზად ჩანს. გამოსავალი შემთხვევითი და საიდუმლო და სრულიად გამოუსადეგარი იქნება, ხოლო წარუმატებლობა საკონტროლო არხის შეცდომად მოვა და არა როგორც რამ, რაც გასაღების ფორმატს ახსენებს. სწორედ ეს შეცდომილი მიმართულებაა ძვირი ნაწილი, რადგან ადამიანებს თავიანთი შიფრების შემოწმებაში აგზავნის. რასაც VPN კითხულობს, ეს არის ფაილის კონკრეტული სტრუქტურა და არა ბაიტების თვითნებური ბლოკი, და ფუნქციის ერთი ვარიანტი სერვერის გარეთ საერთოდ ვერ დამზადდება.

როგორი უნდა იყოს სინამდვილეში დისკზე არსებული ფაილი

OpenVPN-ის სტატიკური გასაღების ფაილი ტექსტია. ის იწყება კომენტარის სტრიქონით, რომელიც აცხადებს, რა არის ის, ატარებს hex მონაცემებს ფიქსირებული სიგანის სტრიქონებში და სულ 256 ბაიტ გასაღების მასალას შეიცავს. OpenVPN მას საკონტროლო არხის საერთო საიდუმლოდ კითხულობს, არა როგორც სერტიფიკატი, არა როგორც პაროლ-ფრაზა და არა როგორც რამ, რასაც TLS ბიბლიოთეკა ამოიცნობდა.

იგივე ტიპის ობიექტი ემსახურება საკონტროლო არხის ორივე ფუნქციას. tls-auth-ის შემთხვევაში თითოეულ პირს მიმართულებაც სჭირდება, რომ ერთი მხარის პაკეტები მისკენ უკან არ აისახოს. tls-crypt-ის შემთხვევაში ერთი საერთო საიდუმლო ორივე მიმართულებით შიფრავს და ავთენტიფიცირებს საკონტროლო არხს, რაც ხელის ჩამორთმევას მალავს და ამავდროულად იცავს.

ამათგან არაფერი საიდუმლო ცოდნა არ არის და ფორმატი მთავარი არ არის. მთავარი ის არის, რომ ფაილი ზუსტად უნდა შეესაბამებოდეს იმას, რასაც მკითხველი ელოდება: სათაური, სტრიქონის სიგანე, ბოლო ახალი სტრიქონი და მთლიანი სიგრძე. ერთი სტრიქონით გადახრილი ფაილი ნაგავად იტვირთება ან საერთოდ იშლება. ამიტომ ორი პირის ბაიტ-ბაიტ შედარება ლეგიტიმური პირველი ტესტია და ის უფრო სწრაფია, ვიდრე ორი კონფიგურაციის ფაილიდან რომელიმეს წაკითხვა.

ერთის შექმნის მხარდაჭერილი გზა

შექმენით უბრალო სტატიკური გასაღები იმ ხელსაწყოთი, რომელიც მას გამოიყენებს, შემდეგ კი მასზე მიუთითეთ ორივე ბოლოდან:

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

ოპციის მართლწერა დროთა განმავლობაში შეიცვალა: 2.4 ეპოქის ძველი ინსტალაციები იყენებდნენ ფორმას ცალკე დროშით ფაილის სახელამდე, ხოლო მიმდინარე ბილდები იღებენ უფრო მოკლეს. ყოველ შემთხვევაში, მიღებული ფაილი იგივე ტიპის ობიექტია, ამიტომ შემოწმება არის ის, აქვთ თუ არა ორივე პირს იდენტური ბაიტები.

მეორე თაობა ამატებს სტრუქტურას, რომლის გამოგონებაც ვერც ერთ გარე გენერატორს არ შეუძლია. სერვერის გასაღები ერთხელ იქმნება და თითოეული კლიენტი იღებს მისგან წარმოებულ გახვეულ გასაღებს:

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

ის, რასაც კლიენტი იღებს, სერვერის საკუთარი გასაღების ასლი არ არის. ეს არის გახვეული ობიექტი, რომელიც ატარებს მეტამონაცემებს, რომელთა გახსნაც მხოლოდ სერვერს შეუძლია, და სწორედ ეს გახვევაა მიზეზი, რის გამოც მოწყობილობაზე ერთი ფაილის გაუქმება ნებისმიერი სხვა მოწყობილობის შეხების გარეშე შეიძლება. შეინახეთ სერვერის გასაღები სერვერზე და მოეპყარით როგორც ამ მოწყობილობაზე დაფუძნებული ნდობის ფესვს.

სად იშლება ხელით გაკეთებული ბაიტები

256 შემთხვევითი ბაიტის hex-ად დაბეჭდვა სწორი სათაურის ქვეშ თეორიულად მისცემდა ჩატვირთვად სტატიკური გასაღების ფაილს. ეს მაინც ცუდი იდეაა. ფორმატირების ყოველი დეტალი ხდება შესაძლებლობა შექმნას მასალა, რომელიც ჩატვირთვისას იშლება ან, უარესი, ორ პირს განსხვავებული მნიშვნელობებით ტოვებს, რომლებიც მხოლოდ ავთენტიფიკაციის წარუმატებლობად ვლინდება.

v2 ვარიანტით მსგავსი არაფერი შეიძლება. გახვეული კლიენტის გასაღები მხოლოდ სერვერის გასაღების პროცესის გამოსავლის სახით არსებობს და სერვერი ინახავს მის გახსნისთვის საჭირო მასალას. შემთხვევითი ბლოკი უარყოფილი იქნება ან უბრალოდ ვერ გაიშიფრება, და ორი შეტყობინებიდან არც ერთი არ ახსენებს შემთხვევითობას.

ვერსიათა თავსებადობა ამ ყველაფრის ზემოთ დგას. პირველ თაობას სჭირდება გამოშვება, რომელიც ორივე ბოლოში მხარს უჭერს მას, ხოლო მეორეს კვლავ უფრო ახალი გამოშვება სჭირდება. ფუნქციის არსებობამდე აწყობილი კლიენტი ვერ დაასრულებს ხელის ჩამორთმევას სერვერთან, რომელიც მხოლოდ გახვეულ მასალას იღებს, და მისი მოხსენებული წარუმატებლობა საკონტროლო არხზე მიუთითებს და არა ვერსიაზე.

როტაცია ყველას გარეთ ჩაკეტვის გარეშე

ერთი საერთო საიდუმლოს როტაცია კოორდინაციის სავარჯიშოა და არა ტექნიკური. თითოეულ კლიენტს ხელში უნდა ჰქონდეს შემცვლელი ფაილი მანამ, სანამ სერვერი წინას გაიწვევს, და ნებისმიერი მანქანა, რომელსაც ჯერ კიდევ ძველი მნიშვნელობა აქვს, სწორედ იმ მომენტში იშლება. არ დაიწყოთ ეს როტაცია სამუშაო დღის შუაში.

v2 განლაგებით როტაცია თითო მოწყობილობაზეა: გასცენით ახალი გახვეული გასაღები ერთი მანქანისთვის და გაისტუმრეთ ძველი მხოლოდ იმ მანქანისთვის. ეს არის მთავარი არგუმენტი გადასვლის სასარგებლოდ, როცა თითოეული კლიენტი იმის მხარდამჭერ გამოშვებაზეა.

ფაილის ნებართვები იმავე საუბარს ეკუთვნის. გასაღები მხოლოდ სერვისის გამშვები ანგარიშისთვის უნდა იყოს წაკითხვადი და არ უნდა ცხოვრობდეს იმავე რეპოზიტორიაში, სადაც ის პროფილები, რომლებსაც იცავს. OpenVPN 2.6-ის სახელმძღვანელო აღწერს შექმნის ფორმებსა და გასაღების მასალის სექციებს, რაც უკეთესი წყაროა, ვიდრე ფორუმის პოსტიდან კოპირებული ბრძანება.

დაკავშირებული სტატიები