From 0d05a0bd6d89a82a080187dc5dba9ff0f91b7bb1 Mon Sep 17 00:00:00 2001 From: busya Date: Wed, 27 May 2026 15:43:27 +0300 Subject: [PATCH] fix: add NSS cert import for Chromium Playwright + libnss3-tools MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - install_ca_to_nss() — imports corporate CA certs into Chromium's NSS database (~/.pki/nssdb), fixing ERR_CERT_AUTHORITY_INVALID in Playwright - libnss3-tools added to Dockerfile for certutil binary --- docker/backend.Dockerfile | 4 +- docker/backend.entrypoint.sh | 75 ++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index d73da64e..5222b461 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -15,11 +15,13 @@ ENV BACKEND_PORT=8000 WORKDIR /app -# Системные зависимости: ca-certificates для корп. сертификатов, curl, git для Playwright/GitPython +# Системные зависимости: ca-certificates для корп. сертификатов, libnss3-tools +# для установки CA в NSS базу Chromium, curl, git для Playwright/GitPython RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ git \ + libnss3-tools \ && rm -rf /var/lib/apt/lists/* # Python зависимости diff --git a/docker/backend.entrypoint.sh b/docker/backend.entrypoint.sh index 4791dff8..dc98f640 100755 --- a/docker/backend.entrypoint.sh +++ b/docker/backend.entrypoint.sh @@ -281,12 +281,87 @@ install_playwright() { } # #endregion docker.backend.entrypoint.install_playwright +# ====================================================================== +# install_ca_to_nss — импорт корпоративных CA в NSS базу Chromium +# ====================================================================== +# #region docker.backend.entrypoint.install_ca_to_nss [C:3] [TYPE Function] +# @BRIEF Импортирует PEM-сертификаты из /usr/local/share/ca-certificates/ +# в NSS Shared DB (~/.pki/nssdb), чтобы Chromium (Playwright) доверял +# корпоративным CA (исправляет ERR_CERT_AUTHORITY_INVALID). +# @PRE certutil (libnss3-tools) установлен. PEM-файлы есть в target_dirs. +# @POST Сертификаты добавлены в NSS базу Chromium с trust-атрибутами "C,,". +# @SIDE_EFFECT Создаёт ~/.pki/nssdb/ если не существовал. +# @LAYER Infrastructure +install_ca_to_nss() { + if ! command -v certutil >/dev/null 2>&1; then + echo "[entrypoint] certutil (libnss3-tools) не найден — пропускаем NSS импорт" + return 0 + fi + + local nss_db_dir="${HOME}/.pki/nssdb" + local nss_db="${nss_db_dir}/sql" + + # CA certs могут быть в llm/ или custom/ + local target_dirs=( + "/usr/local/share/ca-certificates/llm" + "/usr/local/share/ca-certificates/custom" + ) + + # Собираем все PEM-файлы + local certs=() + for dir in "${target_dirs[@]}"; do + if [ -d "$dir" ]; then + for f in "$dir"/*.pem "$dir"/*.crt; do + [ -f "$f" ] && certs+=("$f") + done + fi + done + + if [ ${#certs[@]} -eq 0 ]; then + echo "[entrypoint] Нет PEM-файлов для NSS импорта — пропускаем" + return 0 + fi + + # Создаём NSS DB если нет + if [ ! -d "$nss_db_dir" ]; then + mkdir -p "$nss_db_dir" + echo "[entrypoint] Создание NSS DB: ${nss_db}" + certutil -N -d "$nss_db" --empty-password 2>/dev/null || true + fi + + local imported=0 + for cert in "${certs[@]}"; do + local nickname + nickname="$(basename "$cert" | sed 's/\.[^.]*$//')" + + # Проверяем, есть ли уже в NSS + if certutil -L -d "$nss_db" -n "$nickname" >/dev/null 2>&1; then + echo "[entrypoint] ✓ NSS: ${nickname} уже импортирован" + continue + fi + + # Добавляем с trust-атрибутами "C,," (CA для TLS) + if certutil -A -d "$nss_db" -n "$nickname" -t "C,," -i "$cert" -a 2>/dev/null; then + echo "[entrypoint] ➕ NSS импортирован: ${nickname}" + imported=$((imported + 1)) + else + echo "[entrypoint] ⚠ NSS ошибка импорта: ${nickname}" + fi + done + + if [ "$imported" -gt 0 ]; then + echo "[entrypoint] ✅ NSS: импортировано ${imported} сертификатов" + fi +} +# #endregion docker.backend.entrypoint.install_ca_to_nss + # ====================================================================== # MAIN # ====================================================================== install_certificates install_llm_ca_certs +install_ca_to_nss install_playwright # Check DB state: empty, legacy (tables exist but no alembic), or managed