From 040d333d7de0824ba0d33194756518c7a7f04dc5 Mon Sep 17 00:00:00 2001 From: busya Date: Wed, 27 May 2026 16:12:37 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20QA=20findings=20=E2=80=94=20Dockerfile?= =?UTF-8?q?=20#endregion=20dedup,=20@RATIONALE,=20grep=20-qF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Removed duplicate #endregion in backend.Dockerfile (P6 critical) - Added @RATIONALE and @REJECTED to install_ca_to_nss and install_llm_ca_certs - Changed grep -q to grep -qF in install_llm_ca_certs validation --- docker/backend.Dockerfile | 1 - docker/backend.entrypoint.sh | 22 +++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) 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/ если не существовал.