#!/bin/bash # generate-node-cert.sh — génère une clé + un certificat client mTLS pour # un noeud, signé par la CA privée du master (voir master-ca-init.sh). # # Flux MANUEL (clé + CSR + signature générées ici, au même endroit) : # réservé à l'usage local sur le master lui-même (ex. certificat # master-internal, généré par install.sh::install-master sans jamais # passer par le réseau). Pour un noeud DISTANT, préférer le flux par # jeton (manage.py create_join_token puis sudo ./install.sh join sur le # noeud, voir ROADMAP.md) : la clé y est générée SUR le noeud et ne # transite jamais par le réseau, contrairement à ce script qui la génère # ici puis suppose qu'elle sera copiée à la main vers le noeud. # # Usage : sudo ./generate-node-cert.sh [répertoire_sortie] # Le nom du noeud devient le CN du certificat, donc son identité MQTT côté # master (use_identity_as_username) — sert de base aux ACL par noeud. set -euo pipefail NODE_NAME="${1:?Usage: $0 [répertoire_sortie]}" CA_DIR="${CA_DIR:-/etc/mosquitto/master-ca}" OUT_DIR="${2:-./certs/$NODE_NAME}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ ! -f "$CA_DIR/ca.key" ]; then echo "CA introuvable dans $CA_DIR — lancer master-ca-init.sh d'abord." >&2 exit 1 fi install -d "$OUT_DIR" openssl genrsa -out "$OUT_DIR/$NODE_NAME.key" 2048 openssl req -new -key "$OUT_DIR/$NODE_NAME.key" -subj "/CN=$NODE_NAME" -out "$OUT_DIR/$NODE_NAME.csr" # Signature + entitlement ACL + restart mosquitto : logique partagée avec # l'endpoint /api/join/ (banevents/views.py::join_node), voir # sign-node-csr.sh — un seul chemin de code qui touche ca.key. CA_DIR="$CA_DIR" "$SCRIPT_DIR/sign-node-csr.sh" "$NODE_NAME" "$OUT_DIR/$NODE_NAME.csr" > "$OUT_DIR/$NODE_NAME.crt" cp "$CA_DIR/ca.crt" "$OUT_DIR/ca.crt" rm "$OUT_DIR/$NODE_NAME.csr" chmod 600 "$OUT_DIR/$NODE_NAME.key" echo "Certificat généré dans $OUT_DIR :" echo " - $NODE_NAME.key, $NODE_NAME.crt (ca.crt copié aussi mais pas utilisé par le noeud :" echo " le certificat serveur du master est vérifié via le magasin de CA système)" echo "À copier sur le noeud (ex. emitter/master-tls/) et référencer via" echo "MQTT_MASTER_CLIENT_KEY / MQTT_MASTER_CLIENT_CERT / MQTT_MASTER_NODE_NAME=$NODE_NAME."