#!/usr/bin/env bash # Génère un certificat auto-signé pour servir la webapp en HTTPS. # # Pourquoi : l'API Geolocation des navigateurs (bouton ⌖ « centrer sur la # position GPS du téléphone ») n'est disponible qu'en contexte sécurisé # (HTTPS). Servir la carte en https://:PORT débloque le GPS sur # téléphone ; le certificat auto-signé affiche un avertissement « non fiable » # que l'on accepte une fois (l'usage est sur le LAN, pas exposé). # # Usage : # ./make-tls-cert.sh # crée tls/webapp.crt + tls/webapp.key # ./make-tls-cert.sh --force # régénère même si le certificat existe # # Le certificat est monté dans le conteneur (./tls → /app/tls) et activé par # les variables LIDAR_SSL_CERTFILE / LIDAR_SSL_KEYFILE (cf. serve-webapp.sh # et docs/DEPLOY_WEBAPP.md). set -euo pipefail cd "$(dirname "$0")" FORCE=0 [ "${1:-}" = "--force" ] && FORCE=1 mkdir -p tls # Garde-fou : si docker compose a déjà monté ./tls, Docker l'a créé root:root. # En tant qu'utilisateur (non root), on ne peut pas écrire dedans. if [ ! -w tls ]; then echo "Erreur : tls/ n'est pas writable par $(id -un) (souvent créé root par Docker)." >&2 echo "Corriger : sudo chown \"$(id -un)\" tls puis relancer $0" >&2 exit 1 fi if [ "$FORCE" -eq 0 ] && [ -f tls/webapp.crt ] && [ -f tls/webapp.key ]; then echo "Certificat auto-signé déjà présent : tls/webapp.crt + tls/webapp.key" echo "Régénérer : $0 --force" else CN="${LIDAR_CERT_CN:-lidar-webapp}" # SAN : nom local du conteneur + IP générique. Le téléphone se connecte # par l'IP du Pi ; le SAN IP ne couvre pas cette IP dynamique d'où # l'avertissement de nom, mais le certificat reste valable (10 ans). openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \ -keyout tls/webapp.key -out tls/webapp.crt \ -subj "/CN=${CN}" \ -addext "subjectAltName=DNS:${CN},DNS:lidar-webapp,DNS:*.local,IP:0.0.0.0" \ > /dev/null chmod 600 tls/webapp.key echo "Certificat auto-signé créé : tls/webapp.crt + tls/webapp.key (valable 10 ans, CN=${CN})" fi echo echo "Activation (webapp.env) :" echo " LIDAR_SSL_CERTFILE=/app/tls/webapp.crt" echo " LIDAR_SSL_KEYFILE=/app/tls/webapp.key" echo "serve-webapp.sh monte ./tls → /app/tls et passe ces variables automatiquement." echo "Puis : ./serve-webapp.sh restart — la carte répond sur https://:PORT."