feat(ssl): add passphrase-protected key and PKCS#12 support in nginx entrypoint

- docker/frontend.entrypoint.sh: add 3 new functions:
  - extract_p12_if_needed — openssl pkcs12 extraction to .crt+.key
  - resolve_ssl_passphrase — read SSL_KEY_PASSPHRASE env var
  - decrypt_key_if_needed — openssl rsa decryption before nginx start
- Pipeline: install CA -> extract p12 -> get passphrase -> select config -> decrypt key -> start nginx
- Crash-early: encrypted key without SSL_KEY_PASSPHRASE exits entrypoint
- docker-compose.enterprise-clean.yml: add SSL_KEY_PASSPHRASE to frontend env
- .env.enterprise-clean.example: document SSL_KEY_PASSPHRASE usage
- build.sh: add SSL_KEY_PASSPHRASE to generated deploy compose
This commit is contained in:
2026-07-04 17:05:51 +03:00
parent 047aff41d9
commit 1c6b3d6e8a
4 changed files with 194 additions and 5 deletions

View File

@@ -39,10 +39,31 @@ FRONTEND_SSL_PORT=443
# ./certs/server.crt
# ./certs/server.key
#
#
# Для PKCS#12 — положите server.p12 (контейнер с сертификатом + ключом):
# ./certs/server.p12
# SSL_KEY_PASSPHRASE=my-passphrase
# (entrypoint извлечёт server.crt и server.key автоматически)
#
# Если приватный ключ зашифрован, укажите пароль:
# SSL_KEY_PASSPHRASE=my-passphrase
# (entrypoint расшифрует ключ перед передачей nginx)
#
# Если директория пуста или не существует — сертификаты не устанавливаются,
# nginx работает в HTTP-only режиме.
CERTS_PATH=./certs
# ======================================================================
# SSL пароль (опционально)
# ======================================================================
# Пароль от приватного ключа (если server.key зашифрован) или от .p12 контейнера.
# Оставьте пустым, если ключ не зашифрован.
# Пример:
# SSL_KEY_PASSPHRASE=my-ssl-passphrase
# SSL_KEY_PASSPHRASE=
# shellcheck disable=SC2148
SSL_KEY_PASSPHRASE=
# ======================================================================
# LLM CA-сертификаты (скачка по URL на старте контейнера)
# ======================================================================