Le SPA appelle /api/v1 en relatif et rien ne routait cet appel vers l'API une fois en conteneur. Le cookie de rafraîchissement prend le préfixe __Secure- dès que APP_ENV sort de local, donc sans HTTPS il n'était jamais posé et l'authentification ne survivait pas à un rechargement de page. Un service proxy, image officielle nginx dont la configuration est montée en volume, devient le seul composant publié : 80 redirige vers 443 et sert le défi ACME, 443 termine le TLS, sert le SPA sur / et l'API sur /api/ sous la même origine, pose HSTS et CSP que l'application refuse délibérément de poser, et ajoute une limitation de débit au frontal. Backend et frontend ne sont plus publiés, la base et l'interface Mailpit sont ramenées sur la boucle locale. nginx lit toujours les deux mêmes fichiers de certificat : seule leur fabrication varie, script openssl pour la démonstration, deploy-hook certbot le jour où un domaine public existera. Le chemin ACME est livré et documenté, pas exercé : sur une IP privée le défi HTTP-01 ne peut pas aboutir.
51 lines
1.5 KiB
Bash
Executable File
51 lines
1.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Contrainte : nginx lit toujours infra/proxy/tls/{fullchain,privkey}.pem, quel que soit le
|
|
# mode d'obtention. Ce script remplit ces deux fichiers pour la démonstration, certbot les
|
|
# remplit par acme-deploy-hook.sh. La configuration nginx ne connaît pas la différence.
|
|
|
|
set -euo pipefail
|
|
|
|
RACINE="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
DESTINATION="$RACINE/infra/proxy/tls"
|
|
HOTE="${PUBLIC_HOST:-enervision.local}"
|
|
ADRESSE="${PUBLIC_IP:-}"
|
|
JOURS="${TLS_DAYS:-365}"
|
|
ECRASER=0
|
|
|
|
for argument in "$@"; do
|
|
case "$argument" in
|
|
--force) ECRASER=1 ;;
|
|
*)
|
|
echo "Usage : PUBLIC_HOST=exemple.local [PUBLIC_IP=10.0.0.10] $0 [--force]" >&2
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ -f "$DESTINATION/fullchain.pem" && $ECRASER -eq 0 ]]; then
|
|
echo "Un certificat existe déjà dans $DESTINATION." >&2
|
|
echo "Relancer avec --force pour l'écraser." >&2
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "$DESTINATION"
|
|
|
|
NOMS="DNS:$HOTE,DNS:localhost"
|
|
if [[ -n "$ADRESSE" ]]; then
|
|
NOMS="$NOMS,IP:$ADRESSE"
|
|
fi
|
|
|
|
openssl req -x509 -nodes -newkey rsa:2048 -sha256 -days "$JOURS" \
|
|
-subj "/CN=$HOTE" \
|
|
-addext "subjectAltName=$NOMS" \
|
|
-keyout "$DESTINATION/privkey.pem" \
|
|
-out "$DESTINATION/fullchain.pem" 2>/dev/null
|
|
|
|
chmod 600 "$DESTINATION/privkey.pem"
|
|
chmod 644 "$DESTINATION/fullchain.pem"
|
|
|
|
echo "Certificat auto-signé écrit dans $DESTINATION."
|
|
echo " Noms couverts : $NOMS"
|
|
echo " Validité : $JOURS jours"
|
|
echo "Le navigateur avertira d'un émetteur inconnu, c'est attendu hors Let's Encrypt."
|