TLS грешки само във фирмената VPN: поправете правилното хранилище за доверие
Същият инструмент, същият лаптоп, само VPN счупва TLS. Прочетете съобщението, намерете CA пакета, който двоичният файл чете, и добавете един корен вместо да изключвате проверките.
Сборката на Go, инсталацията на Composer и клиентът на Python работят у дома и всички се провалят във фирмената VPN. Този модел говори за пътя, а не за приложението. Нещо по тунела е променило веригата от сертификати, която процесът ви вижда, или е нулирало ръкостискането, преди верига да пристигне изобщо. Двете повреди изглеждат сходно в терминала и изискват напълно различни реакции.
Три съобщения, три механизма
Грешка x509 certificate signed by unknown authority означава, че е изградена верига и нейният корен липсва в хранилището за доверие, което този процес използва. Грешка self-signed certificate in certificate chain обикновено означава, че инспекционен прокси е отговорил със свой собствен сертификат, а това е верига, която вашата среда за изпълнение не разпознава. SSL EOF по време на ръкостискането означава, че връзката е затворена, преди да бъде изпратен какъвто и да е използваем сертификат, и това е междинно устройство, което отхвърля ClientHello, а не проблем с доверието изобщо.
Добавянето на несигурен флаг кара и трите съобщения да изчезнат, като оставя прихващането на място, и премахва проверката, която би хванала истински нападател.
Намерете пакета, който процесът действително чете
Фирменият корен, инсталиран в хранилището на Windows, поправя браузъри и приложения .NET, които се допитват до системното хранилище. Той не прави нищо за сборка, работеща в контейнер, който носи свой CA пакет, и нищо за процес на Python с certifi или процес на Node с вградения си списък. Go чете системния пул на средата, в която работи двоичният файл, тоест контейнера, а не лаптопа. Затова една машина едновременно дава работещ браузър и провалящ се инструмент за сборка.
Питайте инструмента, вместо да предполагате. python3 -c "import ssl; print(ssl.get_default_verify_paths())" отпечатва файловете, които Python ще прегледа, а node -e "console.log(process.env.NODE_EXTRA_CA_CERTS)" показва дали вече е зададено заместване. За контейнер пуснете същата проверка вътре в образа, защото това е средата, която сборката действително използва.
Инсталирайте един корен там, където работи сборката
Вземете инспекционния корен от ИТ отдела като PEM файл и проверете отпечатъка му по отделен канал, преди да му се доверите. На образи, базирани на Debian, го копирайте в /usr/local/share/ca-certificates/ и пуснете update-ca-certificates; образите от семейството на RHEL използват update-ca-trust, след като поставят файла в /etc/pki/ca-trust/source/anchors/. При сборка на контейнер добавете тези стъпки преди неуспешната команда, за да се кешира слоят над инсталацията на зависимостите.
За локален devcontainer монтирайте PEM файла и пускайте същата команда за обновяване при старт, вместо да я вграждате в личен образ, който никой друг не може да възпроизведе. Инструментите, които носят свой пакет, се нуждаят от собствено документирано заместване: pip има настройка за сертификат, npm има настройка cafile, а повечето други приемат стандартните променливи на средата.
Това не е същото като да приемате всеки сертификат. Добавяте един конкретен корен, получен от страната, която извършва инспекцията, към една среда, и проверката остава включена за всяка друга верига. Запишете кой файл е добавен и кога изтича, защото инспекционният корен се подновява като всеки друг CA.
Когато ръкостискането умира преди сертификат
Ако не се представи нищо, никаква промяна в хранилището за доверие няма да помогне. Сравнете същата заявка с включен и изключен тунел, после прегледайте веригата директно с openssl s_client -connect host:443 -servername host -showcerts. Връзка, която завършва извън VPN и се нулира вътре в нея, е политическо решение на междинното устройство и лекът е изключение за този хост, а не още един сертификат. Поискайте регистърът на пакетите или API крайната точка да бъдат пропуснати без промяна.
Разделянето на тунела, така че инструментът да заобикаля VPN, избягва инспекция за този трафик, което може да наруши политиката и не прави инструмента надежден.
Запишете резултата за всеки инструмент
Кратка бележка, изброяваща двоичния файл, файла за доверие, който чете, променливата на средата в игра и одобреното изключение, спестява на следващия човек цялата диагностика. Пазете бележката за всеки инструмент, а не за всеки лаптоп, защото лаптопът рядко е нещото, което се е променило.
И дръжте две изречения отделно в тикета: инсталирахме конкретен фирмен корен и изключихме проверката. Само едно от тях е действие за поддръжка.