#!/usr/bin/env bash # gen_fleet_ca.sh — Generate the Hermes fleet Certificate Authority. # # Usage: # ./scripts/gen_fleet_ca.sh [--out-dir ] # # Outputs (default: ~/.hermes/pki/ca/): # fleet-ca.key — CA private key (chmod 600, keep secret) # fleet-ca.crt — CA certificate (distribute to all fleet nodes) # # The CA is valid for 10 years. Regenerate + redistribute when it expires. # Refs #806 set -euo pipefail CA_SUBJECT="/CN=Hermes Fleet CA/O=Hermes/OU=Fleet" CA_DAYS=3650 # 10 years # --------------------------------------------------------------------------- # Parse args # --------------------------------------------------------------------------- OUT_DIR="${HOME}/.hermes/pki/ca" while [[ $# -gt 0 ]]; do case "$1" in --out-dir) OUT_DIR="$2"; shift 2 ;; -h|--help) echo "Usage: $0 [--out-dir ]" exit 0 ;; *) echo "Unknown option: $1" >&2 exit 1 ;; esac done # --------------------------------------------------------------------------- # Prereq check # --------------------------------------------------------------------------- if ! command -v openssl &>/dev/null; then echo "ERROR: openssl not found. Install OpenSSL and re-run." >&2 exit 1 fi mkdir -p "$OUT_DIR" chmod 700 "$OUT_DIR" CA_KEY="$OUT_DIR/fleet-ca.key" CA_CRT="$OUT_DIR/fleet-ca.crt" if [[ -f "$CA_KEY" || -f "$CA_CRT" ]]; then echo "Fleet CA already exists in $OUT_DIR" echo " $CA_KEY" echo " $CA_CRT" echo "Delete them manually if you want to regenerate." exit 0 fi echo "Generating fleet CA in $OUT_DIR ..." # Generate 4096-bit RSA key for the CA openssl genrsa -out "$CA_KEY" 4096 2>/dev/null chmod 600 "$CA_KEY" # Self-sign the CA certificate openssl req -new -x509 \ -key "$CA_KEY" \ -out "$CA_CRT" \ -days "$CA_DAYS" \ -subj "$CA_SUBJECT" \ -addext "basicConstraints=critical,CA:TRUE,pathlen:0" \ -addext "keyUsage=critical,keyCertSign,cRLSign" \ -addext "subjectKeyIdentifier=hash" 2>/dev/null chmod 644 "$CA_CRT" echo "" echo "Fleet CA generated successfully:" echo " Private key : $CA_KEY (keep secret)" echo " Certificate : $CA_CRT (distribute to all fleet nodes)" echo "" openssl x509 -in "$CA_CRT" -noout -subject -dates