certify.sh hinzugefügt
This commit is contained in:
248
certify.sh
Normal file
248
certify.sh
Normal file
@ -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}"
|
||||
Reference in New Issue
Block a user