#!/bin/bash set -e # ============================================================ # certify.sh # Signiert einen vorhandenen SSH-Public-Key über die zentrale CA # ============================================================ # Farben GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # ============================================================ # Konfiguration # ============================================================ CA_HOST="100.87.87.5" CA_USER="alf" CA_PORT=2222 REMOTE_SIGN_SCRIPT="/home/alf/remote_sign.sh" # Schlüssel zur Anmeldung an der CA CA_LOGIN_KEY="$HOME/.ssh/id_ca" # Temporärer Speicher auf der CA REMOTE_DIR="/tmp" # ============================================================ # Voraussetzungen prüfen # ============================================================ if ! command -v gum >/dev/null 2>&1; then echo -e "${RED}[!] gum ist nicht installiert.${NC}" exit 1 fi if [[ ! -f "$CA_LOGIN_KEY" ]]; then echo -e "${RED}[!] CA-Login-Key nicht gefunden:${NC}" echo " $CA_LOGIN_KEY" echo echo "Bitte den Schlüssel bereitstellen." exit 1 fi # ============================================================ # Public Key auswählen # ============================================================ PUBKEY=$(gum input \ --header "Welchen Public Key möchtest du zertifizieren?" \ --placeholder "$HOME/.ssh/id_abs.pub" \ --value "$HOME/.ssh/id_ed25519.pub") if [[ -z "$PUBKEY" ]]; then echo -e "${RED}[!] Kein Public Key angegeben.${NC}" exit 1 fi # ~ expandieren PUBKEY="${PUBKEY/#\~/$HOME}" if [[ ! -f "$PUBKEY" ]]; then echo -e "${RED}[!] Public Key nicht gefunden:${NC}" echo " $PUBKEY" exit 1 fi if [[ "$PUBKEY" != *.pub ]]; then echo -e "${RED}[!] Bitte einen Public Key (*.pub) angeben.${NC}" exit 1 fi # ============================================================ # Benutzer / Principals auswählen # ============================================================ echo PRINCIPALS=$(gum choose \ --no-limit \ --header "Benutzer auswählen (Leertaste = markieren, Enter = bestätigen)" \ "alf" \ "root" \ "oberkoetter" \ "Benutzer manuell eingeben") # Falls nichts ausgewählt wurde if [[ -z "$PRINCIPALS" ]]; then echo -e "${RED}[!] Kein Benutzer ausgewählt.${NC}" echo echo "Tipp: Mit der Leertaste mindestens einen Benutzer markieren." exit 1 fi # ============================================================ # Manuelle Benutzer # ============================================================ if echo "$PRINCIPALS" | grep -q "^Benutzer manuell eingeben$"; then MANUAL_USER=$(gum input \ --header "Benutzername eingeben" \ --placeholder "z.B. admin") if [[ -z "$MANUAL_USER" ]]; then echo -e "${RED}[!] Kein Benutzer angegeben.${NC}" exit 1 fi # Eintrag "Benutzer manuell eingeben" entfernen PRINCIPALS=$(echo "$PRINCIPALS" | grep -v "^Benutzer manuell eingeben$" || true) # Manuellen Benutzer hinzufügen if [[ -n "$PRINCIPALS" ]]; then PRINCIPALS="$PRINCIPALS"$'\n'"$MANUAL_USER" else PRINCIPALS="$MANUAL_USER" fi fi # Zeilen in kommagetrennte Liste umwandeln PRINCIPALS=$(echo "$PRINCIPALS" | sed '/^$/d' | paste -sd ',' -) if [[ -z "$PRINCIPALS" ]]; then echo -e "${RED}[!] Keine gültigen Benutzer ausgewählt.${NC}" exit 1 fi # ============================================================ # Gültigkeitsdauer # ============================================================ VALIDITY=$(gum choose \ --header "Gültigkeitsdauer auswählen" \ "300 (5 Minuten)" \ "600 (10 Minuten)" \ "1800 (30 Minuten)" \ "3600 (1 Stunde)" \ "15552000 (6 Monate / halbes Jahr)") VALIDITY=$(echo "$VALIDITY" | awk '{print $1}') # ============================================================ # Informationen anzeigen # ============================================================ echo echo -e "${YELLOW}----------------------------------------${NC}" echo -e "${YELLOW} Zertifikat wird erstellt${NC}" echo -e "${YELLOW}----------------------------------------${NC}" echo "Public Key : $PUBKEY" echo "Benutzer : $PRINCIPALS" echo "Gültigkeit : $VALIDITY Sekunden" echo "CA : $CA_USER@$CA_HOST" echo -e "${YELLOW}----------------------------------------${NC}" echo if ! gum confirm "Zertifikat jetzt erstellen?"; then echo "Abgebrochen." exit 0 fi # ============================================================ # Dateinamen # ============================================================ KEY_FILENAME=$(basename "$PUBKEY") REMOTE_PUB="$REMOTE_DIR/$KEY_FILENAME" LOCAL_CERT="${PUBKEY%.pub}-cert.pub" # ============================================================ # Public Key zur CA kopieren # ============================================================ echo -e "${YELLOW}[*] Public Key zur CA kopieren...${NC}" scp \ -i "$CA_LOGIN_KEY" \ -P "$CA_PORT" \ "$PUBKEY" \ "$CA_USER@$CA_HOST:$REMOTE_PUB" # ============================================================ # Signatur anfordern # ============================================================ echo -e "${YELLOW}[*] Public Key von der CA signieren lassen...${NC}" ssh \ -i "$CA_LOGIN_KEY" \ -p "$CA_PORT" \ "$CA_USER@$CA_HOST" \ "$REMOTE_SIGN_SCRIPT '$REMOTE_PUB' '$PRINCIPALS' '$VALIDITY'" # ============================================================ # Zertifikat zurückholen # ============================================================ echo -e "${YELLOW}[*] Zertifikat von der CA holen...${NC}" scp \ -i "$CA_LOGIN_KEY" \ -P "$CA_PORT" \ "$CA_USER@$CA_HOST:${REMOTE_PUB%.pub}-cert.pub" \ "$LOCAL_CERT" # ============================================================ # Temporäre Dateien auf CA löschen # ============================================================ ssh \ -i "$CA_LOGIN_KEY" \ -p "$CA_PORT" \ "$CA_USER@$CA_HOST" \ "rm -f '$REMOTE_PUB' '${REMOTE_PUB%.pub}-cert.pub'" # ============================================================ # Ergebnis # ============================================================ echo echo -e "${GREEN}[✓] Zertifikat erfolgreich erstellt!${NC}" echo echo "Public Key : $PUBKEY" echo "Zertifikat : $LOCAL_CERT" echo "Benutzer : $PRINCIPALS" echo "Gültigkeit : $VALIDITY Sekunden" echo # ============================================================ # Zertifikat anzeigen # ============================================================ echo -e "${YELLOW}[*] Zertifikatinformationen:${NC}" echo ssh-keygen -L -f "$LOCAL_CERT" echo echo -e "${GREEN}[✓] Fertig.${NC}"