Съобщението казва, че OpenVPN не може да зареди вграден сертификат, а името на файла, което пазите в главата си, твърди друго. Това, което е получил парсерът, е по-важно от това, което съдържа файловата система, защото директивата cert приема два напълно различни вида стойност. Едната е път, който тя отваря; другата е PEM текст, пристигнал вътре в конфигурацията. Докато не знаете каква форма е получил работещият клиент, всяко поправяне е догадка.

Две форми на съхранение, една директива

Директивите cert, key и ca приемат съответно път или вграден блок. Когато стойността е път, OpenVPN отваря този файл и чете обекта от диска. Когато конфигурацията съдържа блок, ограничен с етикети cert, същата директива вместо това използва съдържанието между тези етикети и не участва отделен файл.

Двете форми в крайна сметка дават един и същ вид обект, затова работещо внедряване може да преминава между тях без друга промяна. Профил, който носи вграден клиентски сертификат и частен ключ, е самодостатъчен и копирането му на друга машина работи без копиране и на директория със сертификати.

Обратното не е вярно. Пускането на client.crt до профил, който вгражда собствените си данни, не променя нищо, защото нищо в конфигурацията не се позовава на този файл. Това е най-честата причина файл, който очевидно съществува, да изглежда пренебрегнат.

Как вграденият блок се превръща в обект

Вграденото съдържание се извлича от конфигурацията и се предава на PEM парсера като текст. Този парсер очаква обичайните граници: ред BEGIN, base64 полезен товар и съответстващ ред END. Ако блокът е отрязан от неуспешно копиране, обвит в HTML от страница за изтегляне или отворен в редактор, който е нормализирал тиретата, парсерът се проваля върху съдържание, което изглежда налично.

<cert>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</cert>

Затова и формулировката на грешката е подвеждаща. Думата вграден описва къде е гледал зареждащият, а не какво е намерил там. Файл, посочен в конфигурация, и обект, вграден в нея, могат да дадат една и съща жалба, когато основните байтове са неизползваеми.

Проверете коя форма действително използва зареденият профил, а не кой файл случайно е отворил редакторът ви:

grep -nE '^(ca|cert|key) |^<(ca|cert|key)>' client.ovpn

Как се разрешава препратка към път

Стойността на път се отваря спрямо работната директория на клиента, а не спрямо директорията, съдържаща конфигурацията. Под systemd тази работна директория е това, което зададе модулът, а интерактивно изпълнение от вашата обвивка наследява нещо съвсем друго. Затова един и същ конфигурационен файл може да работи при ръчен тест и да се провали като услуга.

Относителните пътища наследяват същата двусмисленост. Когато видите голо име на файл, попитайте каква е текущата директория на процеса в производство, вместо да предполагате, че съвпада с терминала ви.

За сертификат, съхраняван отделно, офлайн разбор потвърждава обекта, преди да отстранявате грешки в каквото и да е над него:

openssl x509 -in client.crt -noout -subject -issuer -dates
openssl pkey -in client.key -noout -check

Тези команди доказват, че файловете са четими и структурно валидни. Те не доказват, че партньорът се доверява на издателя, че сертификатът все още е в срока си на валидност или че ключът принадлежи към него.

Какво може и какво не може да ви каже грешката на парсера

Провалът при разбор локализира проблема до един вход и един етап. Той не ви казва коя от двете форми на съхранение е използвал клиентът и не ви казва дали обектът би бил приет. Това са отделни въпроси с отделни доказателства.

След като разборът успее, следващият провал принадлежи на по-късен етап. Отказ на доверие, несъответствие на предназначението или несъответствие на ключа се съобщава от партньора или от слоя TLS, а не от зареждащия. Повтарящата се подмяна на същия файл няма да премести тази грешка.

Дръжте чувствителната половина извън публичните доклади, докато разследвате. Споделяйте имената на директивите, текста на грешката и структурата на блока, като премахнете ключовия материал и всеки идентифициращ полезен товар. Ръководството openvpn(8) документира двете форми на файловите директиви и поведението на работната директория зад тях.

Подобни статии