Files
yourpart3/setup-ssl.sh

305 lines
9.9 KiB
Bash
Executable File

#!/bin/bash
# SSL/TLS Setup Script für YourPart Daemon
# Erstellt oder verwaltet SSL-Zertifikate für WebSocket Secure (WSS)
# Unterstützt Self-Signed Certificates und Let's Encrypt
set -e
# Farben für Logging
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
CERT_DIR="/etc/yourpart"
CERT_FILE="$CERT_DIR/server.crt"
KEY_FILE="$CERT_DIR/server.key"
CSR_FILE="$CERT_DIR/server.csr"
# Let's Encrypt Verzeichnisse
LETSENCRYPT_DIR="/etc/letsencrypt/live"
LETSENCRYPT_CERT="$LETSENCRYPT_DIR/your-part.de/fullchain.pem"
LETSENCRYPT_KEY="$LETSENCRYPT_DIR/your-part.de/privkey.pem"
# Prüfe ob OpenSSL installiert ist
if ! command -v openssl &> /dev/null; then
log_error "OpenSSL ist nicht installiert!"
exit 1
fi
# Funktionen
setup_letsencrypt() {
log_info "Let's Encrypt Setup für your-part.de"
# Prüfe ob certbot installiert ist
if ! command -v certbot &> /dev/null; then
log_error "Certbot ist nicht installiert!"
log_info "Installiere Certbot..."
if command -v apt &> /dev/null; then
sudo apt update
sudo apt install -y certbot
elif command -v zypper &> /dev/null; then
sudo zypper install -y certbot
else
log_error "Paketmanager nicht unterstützt. Installiere Certbot manuell."
exit 1
fi
fi
# Prüfe ob Let's Encrypt Zertifikate bereits existieren
if [ -f "$LETSENCRYPT_CERT" ] && [ -f "$LETSENCRYPT_KEY" ]; then
log_info "Let's Encrypt Zertifikate existieren bereits"
# Prüfe Gültigkeit
if openssl x509 -in "$LETSENCRYPT_CERT" -text -noout &> /dev/null; then
log_success "Let's Encrypt Zertifikat ist gültig"
# Zeige Zertifikats-Informationen
log_info "Let's Encrypt Zertifikats-Informationen:"
openssl x509 -in "$LETSENCRYPT_CERT" -text -noout | grep -E "(Subject:|Not Before|Not After|DNS:)"
read -p "Möchten Sie die Zertifikate erneuern? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info "Zertifikate bleiben unverändert"
return 0
fi
else
log_warning "Let's Encrypt Zertifikat ist ungültig, erstelle neue..."
fi
fi
# Erstelle oder erneuere Let's Encrypt Zertifikat
log_info "Erstelle/erneuere Let's Encrypt Zertifikat für your-part.de..."
# Prüfe ob Port 80 verfügbar ist (für HTTP-01 Challenge)
if ! sudo netstat -tlnp | grep -q ":80 "; then
log_warning "Port 80 ist nicht verfügbar. Stelle sicher, dass kein anderer Service läuft."
log_info "Oder verwende DNS-01 Challenge mit --dns-cloudflare oder ähnlich"
fi
# Erstelle Zertifikat mit HTTP-01 Challenge
sudo certbot certonly --standalone -d your-part.de --non-interactive --agree-tos --email admin@your-part.de
if [ $? -eq 0 ]; then
log_success "Let's Encrypt Zertifikat erfolgreich erstellt!"
# Erstelle Symlinks zu den Zertifikaten
sudo ln -sf "$LETSENCRYPT_CERT" "$CERT_FILE"
sudo ln -sf "$LETSENCRYPT_KEY" "$KEY_FILE"
# Setze korrekte Berechtigungen
sudo chown yourpart:yourpart "$CERT_FILE" "$KEY_FILE"
sudo chmod 644 "$CERT_FILE"
sudo chmod 600 "$KEY_FILE"
# Zeige Zertifikats-Informationen
log_info "Let's Encrypt Zertifikats-Informationen:"
openssl x509 -in "$CERT_FILE" -text -noout | grep -E "(Subject:|Not Before|Not After|DNS:)"
# Erstelle Auto-Renewal Cron Job
setup_auto_renewal
else
log_error "Let's Encrypt Zertifikat konnte nicht erstellt werden!"
exit 1
fi
}
setup_auto_renewal() {
log_info "Richte automatische Zertifikats-Erneuerung ein..."
# Erstelle Renewal Script
sudo tee /etc/yourpart/renew-ssl.sh > /dev/null << 'EOF'
#!/bin/bash
# Automatische SSL-Zertifikats-Erneuerung für YourPart Daemon
CERT_DIR="/etc/yourpart"
LETSENCRYPT_CERT="/etc/letsencrypt/live/your-part.de/fullchain.pem"
LETSENCRYPT_KEY="/etc/letsencrypt/live/your-part.de/privkey.pem"
# Erneuere Zertifikat
certbot renew --quiet
if [ $? -eq 0 ]; then
# Aktualisiere Symlinks
ln -sf "$LETSENCRYPT_CERT" "$CERT_DIR/server.crt"
ln -sf "$LETSENCRYPT_KEY" "$CERT_DIR/server.key"
# Setze Berechtigungen
chown yourpart:yourpart "$CERT_DIR/server.crt" "$CERT_DIR/server.key"
chmod 644 "$CERT_DIR/server.crt"
chmod 600 "$CERT_DIR/server.key"
# Starte Daemon neu
systemctl reload yourpart-daemon
echo "$(date): SSL-Zertifikat erfolgreich erneuert" >> /var/log/yourpart/ssl-renewal.log
fi
EOF
sudo chmod +x /etc/yourpart/renew-ssl.sh
# Füge Cron Job hinzu (täglich um 2:30 Uhr)
(sudo crontab -l 2>/dev/null; echo "30 2 * * * /etc/yourpart/renew-ssl.sh") | sudo crontab -
log_success "Automatische Erneuerung eingerichtet (täglich um 2:30 Uhr)"
}
log_info "SSL/TLS Setup für YourPart Daemon"
# Benutzerauswahl
echo ""
log_info "Wählen Sie den Zertifikatstyp:"
echo "1) Self-Signed Certificate (für Entwicklung/Testing)"
echo "2) Let's Encrypt Certificate (für Produktion)"
echo "3) Bestehende Let's Encrypt Zertifikate verwenden"
echo ""
read -p "Ihre Wahl (1-3): " -n 1 -r
echo ""
case $REPLY in
1)
log_info "Self-Signed Certificate wird erstellt..."
CERT_TYPE="self-signed"
;;
2)
log_info "Let's Encrypt Certificate wird erstellt..."
CERT_TYPE="letsencrypt"
;;
3)
log_info "Bestehende Let's Encrypt Zertifikate werden verwendet..."
CERT_TYPE="existing-letsencrypt"
;;
*)
log_error "Ungültige Auswahl!"
exit 1
;;
esac
# Erstelle Zertifikats-Verzeichnis falls nicht vorhanden
if [ ! -d "$CERT_DIR" ]; then
log_info "Erstelle Zertifikats-Verzeichnis: $CERT_DIR"
sudo mkdir -p "$CERT_DIR"
fi
# Führe entsprechenden Setup-Typ aus
case $CERT_TYPE in
"self-signed")
# Prüfe ob bereits Zertifikate existieren
if [ -f "$CERT_FILE" ] && [ -f "$KEY_FILE" ]; then
log_info "Zertifikate existieren bereits"
# Prüfe Gültigkeit der Zertifikate
if openssl x509 -in "$CERT_FILE" -text -noout &> /dev/null; then
log_success "Zertifikat ist gültig"
# Zeige Zertifikats-Informationen
log_info "Zertifikats-Informationen:"
openssl x509 -in "$CERT_FILE" -text -noout | grep -E "(Subject:|Not Before|Not After|DNS:)"
read -p "Möchten Sie neue Zertifikate erstellen? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info "Zertifikate bleiben unverändert"
exit 0
fi
else
log_warning "Zertifikat ist ungültig, erstelle neue..."
fi
fi
log_info "Erstelle neue Self-Signed SSL-Zertifikate..."
# Erstelle Private Key
log_info "Erstelle Private Key..."
sudo openssl genrsa -out "$KEY_FILE" 2048
sudo chmod 600 "$KEY_FILE"
sudo chown yourpart:yourpart "$KEY_FILE"
# Erstelle Certificate Signing Request (CSR)
log_info "Erstelle Certificate Signing Request..."
sudo openssl req -new -key "$KEY_FILE" -out "$CSR_FILE" -subj "/C=DE/ST=Germany/L=Berlin/O=YourPart/OU=IT/CN=your-part.de"
# Erstelle Self-Signed Certificate
log_info "Erstelle Self-Signed Certificate..."
sudo openssl x509 -req -days 365 -in "$CSR_FILE" -signkey "$KEY_FILE" -out "$CERT_FILE"
# Setze korrekte Berechtigungen
sudo chmod 644 "$CERT_FILE"
sudo chown yourpart:yourpart "$CERT_FILE"
# Lösche CSR-Datei (nicht mehr benötigt)
sudo rm -f "$CSR_FILE"
log_success "Self-Signed SSL-Zertifikate erfolgreich erstellt!"
;;
"letsencrypt")
setup_letsencrypt
;;
"existing-letsencrypt")
if [ -f "$LETSENCRYPT_CERT" ] && [ -f "$LETSENCRYPT_KEY" ]; then
log_info "Verwende bestehende Let's Encrypt Zertifikate..."
# Erstelle Symlinks zu den Zertifikaten
sudo ln -sf "$LETSENCRYPT_CERT" "$CERT_FILE"
sudo ln -sf "$LETSENCRYPT_KEY" "$KEY_FILE"
# Setze korrekte Berechtigungen
sudo chown yourpart:yourpart "$CERT_FILE" "$KEY_FILE"
sudo chmod 644 "$CERT_FILE"
sudo chmod 600 "$KEY_FILE"
log_success "Let's Encrypt Zertifikate erfolgreich verlinkt!"
# Richte Auto-Renewal ein
setup_auto_renewal
else
log_error "Let's Encrypt Zertifikate nicht gefunden in $LETSENCRYPT_DIR"
log_info "Führen Sie zuerst 'certbot certonly' aus oder wählen Sie Option 2"
exit 1
fi
;;
esac
# Zeige Zertifikats-Informationen
log_info "Zertifikats-Informationen:"
openssl x509 -in "$CERT_FILE" -text -noout | grep -E "(Subject:|Not Before|Not After|DNS:)"
log_info ""
log_info "Nächste Schritte:"
log_info "1. Aktiviere SSL in der Konfiguration:"
log_info " WEBSOCKET_SSL_ENABLED=true"
log_info "2. Starte den Daemon neu:"
log_info " sudo systemctl restart yourpart-daemon"
log_info "3. Verbinde dich mit:"
log_info " wss://your-part.de:4551"
log_info ""
if [ "$CERT_TYPE" = "self-signed" ]; then
log_warning "Hinweis: Dies ist ein Self-Signed Certificate!"
log_warning "Für Produktionsumgebungen verwenden Sie Let's Encrypt (Option 2)."
else
log_success "Let's Encrypt Zertifikat ist produktionsbereit!"
fi