diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 5222b461..0d7b44e7 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -5,7 +5,6 @@ # @RELATION DEPENDS_ON -> [EXT:path:backend/requirements.txt] # @PRE Docker builder context — корень проекта. backend/ и docker/ доступны. # @POST Образ с backend API, Playwright, entrypoint для bootstrap admin и установки сертификатов. -# #endregion docker.backend.Dockerfile FROM python:3.11-slim diff --git a/docker/backend.entrypoint.sh b/docker/backend.entrypoint.sh index dc98f640..16d7dbeb 100755 --- a/docker/backend.entrypoint.sh +++ b/docker/backend.entrypoint.sh @@ -82,6 +82,16 @@ install_certificates() { # @BRIEF Скачивает PEM/DER-сертификаты из LLM_CA_CERT_URLS, конвертирует DER→PEM, # устанавливает в системное хранилище, создаёт хеш-симлинки и при необходимости # добавляет в ca-certificates.crt напрямую (fallback для OpenSSL 3-совместимости). +# @RATIONALE DER→PEM конвертация необходима, т.к. update-ca-certificates ожидает +# PEM-формат (-----BEGIN CERTIFICATE-----). Корпоративные PKI часто отдают +# сертификаты в DER (бинарном) формате через HTTP. +# @RATIONALE Хеш-симлинки (hash.0) создаются вручную, т.к. update-ca-certificates +# в Debian Bookworm (python:3.11-slim) иногда пропускает создание ссылок для +# сертификатов из поддиректорий. Fallback cat в ca-certificates.crt гарантирует +# что OpenSSL 3.x увидит сертификаты даже если update-ca-certificates их пропустит. +# @REJECTED Вариант "только контейнерный volume с .crt файлами" отвергнут — +# требует ручного копирования сертификатов на хост перед запуском. +# URL-based подход позволяет централизованно управлять сертификатами через PKI. # @PRE LLM_CA_CERT_URLS — строка с URL через пробел; curl и openssl установлены. # @POST Сертификаты доступны в /etc/ssl/certs/ca-certificates.crt. # Хеш-симлинки созданы для каждого сертификата. @@ -180,7 +190,7 @@ install_llm_ca_certs() { cert_subject="$(openssl x509 -in "$pem" -noout -subject 2>/dev/null | head -1 || echo "unknown")" # Проверяем есть ли в ca-certificates.crt - if grep -q "$cert_name" /etc/ssl/certs/ca-certificates.crt 2>/dev/null || \ + if grep -qF "$cert_name" /etc/ssl/certs/ca-certificates.crt 2>/dev/null || \ grep -qF "$(openssl x509 -in "$pem" -noout -serial 2>/dev/null)" /etc/ssl/certs/ca-certificates.crt 2>/dev/null; then echo "[entrypoint] ✅ ${cert_name} — в ca-certificates.crt (${cert_subject})" else @@ -288,6 +298,16 @@ install_playwright() { # @BRIEF Импортирует PEM-сертификаты из /usr/local/share/ca-certificates/ # в NSS Shared DB (~/.pki/nssdb), чтобы Chromium (Playwright) доверял # корпоративным CA (исправляет ERR_CERT_AUTHORITY_INVALID). +# @RATIONALE Playwright's Chromium использует NSS Shared DB (~/.pki/nssdb) +# для CA trust, отдельно от системного OpenSSL bundle. update-ca-certificates +# добавляет сертификаты в /etc/ssl/certs/, но Chromium их не видит. +# certutil -A -t "C,," импортирует PEM как доверенный CA для TLS. +# @RATIONALE NSS импорт выполняется после install_llm_ca_certs (скачивает .pem) +# и update-ca-certificates (устанавливает в систему), но перед +# install_playwright (который может запустить Chromium). Этот порядок +# гарантирует, что PEM-файлы уже есть на диске до создания NSS DB. +# @REJECTED Использование Playwright --ignore-certificate-errors отвергнуто — +# отключает ВСЕ SSL проверки глобально, а не только для корп. CA. # @PRE certutil (libnss3-tools) установлен. PEM-файлы есть в target_dirs. # @POST Сертификаты добавлены в NSS базу Chromium с trust-атрибутами "C,,". # @SIDE_EFFECT Создаёт ~/.pki/nssdb/ если не существовал.