Aller au contenu

HTTPS

Pourquoi c'est obligatoire

Les navigateurs n'autorisent l'accès au micro que dans un contexte sécurisé. Une adresse en http:// sur le réseau local est refusée, sans message clair pour l'utilisateur.

Kauze va plus loin : le serveur nginx ne sert en HTTP que le portail captif du hotspot, les QR codes et la page d'impression. Toute autre requête est redirigée vers le nom du site, et l'API n'est pas relayée en HTTP. Sans certificat valide, l'application entière est inaccessible, pas seulement l'enregistrement.

Le domaine

Chaque site installé a son nom, un sous-domaine de kauze.tech, par exemple chu.kauze.tech. Il n'est pas écrit dans l'image : le nginx du frontend porte un modèle où ${KAUZE_DOMAINE} est substitué au démarrage du conteneur, depuis la ligne KAUZE_DOMAINE du fichier .env. Une seule image sert donc tous les sites, et le disque de livraison déclare lequel elle servira (prepare-delivery.sh --domaine <nom>).

Changer de nom sur une machine installée tient en une ligne du .env, un docker compose up -d, et un certificat réémis pour le nouveau nom. Le script d'installation lit cette même ligne : c'est pour ce nom qu'il demande le certificat et c'est elle que portent les QR codes. Sans elle, il le dit et n'émet rien, plutôt que d'émettre pour un nom que personne ne tape. L'adresse du hotspot, 192.168.4.1, reste fixée dans le script d'installation.

Comment le certificat est obtenu

Le serveur n'est pas joignable depuis Internet, donc la validation classique par HTTP est impossible. Le certificat Let's Encrypt est obtenu par validation DNS, via le fournisseur deSEC, qui expose une API que le plugin certbot sait piloter.

Il faut que la zone du domaine soit déléguée en totalité à deSEC par des enregistrements NS. Un simple CNAME sur _acme-challenge ne suffit pas : le plugin met à jour la zone chez deSEC et ne trouve pas le nom s'il n'y est pas hébergé.

Procédure

  1. Créez un compte deSEC et ajoutez-y la zone, c'est-à-dire le domaine racine (kauze.tech), pas le nom du site.
  2. Chez le registrar, remplacez les serveurs de noms par ns1.desec.io et ns2.desec.org. Contrôlez la délégation par dig NS <domaine> +short avant d'aller plus loin.
  3. Créez un jeton d'API. Il n'a besoin ni de créer ni de supprimer des domaines.
  4. Sur le serveur, écrivez le jeton dans un fichier lisible par son propriétaire seulement :

    bash mkdir -p ~/.cause/letsencrypt cat > ~/.cause/letsencrypt/desec.ini << 'EOF' dns_desec_token = VOTRE_JETON EOF chmod 600 ~/.cause/letsencrypt/desec.ini

  5. Relancez le script d'installation, celui du disque sur un serveur livré, voir Relancer le script. Le script installe certbot et son plugin deSEC, émet ou renouvelle le certificat, copie fullchain.pem et privkey.pem dans ~/.cause/certs/ et y écrit le bloc nginx https.conf : port 443, TLS 1.2 et 1.3, relais de /api/ vers le backend, taille d'upload maximale de 500 Mo.

  6. nginx charge ce bloc au démarrage du conteneur. Si le certificat est arrivé après le premier démarrage, un docker compose restart frontend suffit. Aucune reconstruction d'image n'est nécessaire.

Si le fichier desec.ini est absent, le script affiche la marche à suivre et continue sans certificat.

L'émission dure dix minutes

Le script fait attendre certbot 600 secondes entre la publication de l'enregistrement de l'épreuve et la demande de validation. Les deux serveurs de deSEC mettent plus de deux minutes à se synchroniser, et Let's Encrypt valide depuis quatre régions dont trois doivent voir le même enregistrement : une attente plus courte échoue sur un NXDOMAIN que rien dans la configuration n'explique.

La longue pause après Requesting a certificate est donc normale.

Renouvellement

Un minuteur systemd cause-cert-renew.timer tente le renouvellement deux fois par jour, à 3 h 17 et 15 h 17, avec un décalage aléatoire de trente minutes. Le crochet de déploiement recopie le certificat et recharge nginx.

Let's Encrypt renouvelle un certificat trente jours avant son expiration. Le serveur doit donc être allumé et connecté à Internet au moins une fois par mois, sinon le certificat expire et l'application devient inaccessible.