Помилки 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, уникає інспекції цього трафіку, що може порушувати політику і не робить інструмент надійним.
Запишіть результат для кожного інструмента
Коротка нотатка з переліком бінарного файлу, файлу довіри, який він читає, задіяної змінної середовища та затвердженого винятку економить наступній людині всю діагностику. Ведуть нотатку за інструментом, а не за ноутбуком, бо ноутбук рідко виявляється тим, що змінилося.
І тримайте два речення окремо в заявці: ми встановили конкретний корпоративний корінь, і ми вимкнули перевірку. Лише одне з цього — дія підтримки.