Files
ssh-cert-login/certify.sh
2026-08-28 10:53:14 +00:00

249 lines
6.5 KiB
Bash

#!/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}"