fix: add NSS cert import for Chromium Playwright + libnss3-tools

- 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
This commit is contained in:
2026-05-27 15:43:27 +03:00
parent 79370f3451
commit 0d05a0bd6d
2 changed files with 78 additions and 1 deletions

View File

@@ -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 зависимости

View File

@@ -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