Как OpenVPN разрешава сертификата и ключа: вграден PEM или път до файл
Една и съща директива носи или път до файл, или вграден PEM обект. Прочетете коя от двете използва зареденият профил, преди да местите сертификати.
Съобщението казва, че 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) документира двете форми на файловите директиви и поведението на работната директория зад тях.