Сообщение об ошибке
Warning: Ignoring extra certs from `/etc/ssl/private-ca/corp-root-ca.pem`, load failed: error:80000002:system library::No such file or directory
Путь — это значение вашей переменной; причина бывает разной: «No such file or directory», если файла нет, «Permission denied», если его нельзя прочитать, и ошибка PEM от OpenSSL, если файл существует, но не в формате PEM.
Node.js start-up — NODE_EXTRA_CA_CERTS could not be read
Что это означает
При запуске Node.js прочитал NODE_EXTRA_CA_CERTS, но не смог загрузить указанный там файл, поэтому работает без ваших дополнительных сертификатов CA. Процесс не останавливается; соединения, которым нужны были эти сертификаты, позже завершаются ошибкой «unable to get local issuer certificate» или «self-signed certificate in certificate chain». Причину объясняет текст OpenSSL после «load failed:».
Почему это происходит
Путь существует на хосте, но не там, где работает Node.js
частоПеременную скопировали в Dockerfile, конфигурацию CI или devcontainer, а файл сертификата остался на машине разработчика; внутри контейнера или раннера такого пути нет.
Относительный путь или нераскрытый символ ~
частоЗначения вроде ./certs/ca.pem отсчитываются от текущего рабочего каталога процесса, а «~/certs/ca.pem» в файле .env или юните systemd никакая оболочка не раскрывает.
Файл нельзя прочитать, или у него неверный формат
иногдаСертификат, экспортированный из Windows в формате DER (.cer), файл, который может прочитать только root, или файл, в котором есть что-то кроме PEM-сертификатов.
Как исправить
- 1.
Проверьте файл, на который указывает переменная
Убедитесь, что путь существует для пользователя, от имени которого работает Node.js, и что openssl может прочитать файл как PEM-сертификат.
bash echo "$NODE_EXTRA_CA_CERTS" ls -l "$NODE_EXTRA_CA_CERTS" openssl x509 -in "$NODE_EXTRA_CA_CERTS" -noout -subject # must be PEM: -----BEGIN CERTIFICATE----- - 2.
Контейнеры: поставляйте файл вместе с переменной
Скопируйте сертификат CA в образ (или смонтируйте его) по тому пути, который указан в переменной.
text # Dockerfile: put the file where the variable points, inside the image COPY corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt ENV NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corp-root-ca.crt - 3.
Используйте абсолютный путь
Раскрывайте путь при задании переменной, чтобы он не зависел от рабочего каталога или от подстановок оболочки.
bash # Absolute path, expanded by the shell before node starts export NODE_EXTRA_CA_CERTS="$HOME/certs/corp-root-ca.pem" - 4.
Преобразуйте DER в PEM
NODE_EXTRA_CA_CERTS ожидает PEM. Преобразуйте двоичные экспортированные файлы командой openssl x509 -inform der; несколько сертификатов можно объединить в один PEM-файл.
bash # A DER (.cer) export from Windows must be converted to PEM first openssl x509 -inform der -in corp-root-ca.cer -out corp-root-ca.pem