Files
Fail2banMqttActionBanishment/scripts/generate-node-cert.sh
T
2026-07-20 11:05:07 +02:00

46 lines
2.3 KiB
Bash
Executable File

#!/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 <nom_du_noeud> [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 <nom_du_noeud> [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."