249 lines
6.5 KiB
Bash
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}"
|