diff --git a/certify.sh b/certify.sh new file mode 100644 index 0000000..f827334 --- /dev/null +++ b/certify.sh @@ -0,0 +1,248 @@ +#!/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}"