Files
yourpart3/setup-ssl-dns.sh

237 lines
7.0 KiB
Bash
Executable File

#!/bin/bash
# SSL/TLS Setup Script für YourPart Daemon mit DNS-01 Challenge
# Für Domains mit DNS-Provider wie Cloudflare, Route53, etc.
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"
LETSENCRYPT_CERT="/etc/letsencrypt/live/your-part.de/fullchain.pem"
LETSENCRYPT_KEY="/etc/letsencrypt/live/your-part.de/privkey.pem"
log_info "SSL/TLS Setup mit DNS-01 Challenge für YourPart Daemon"
# 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
# DNS Provider Auswahl
echo ""
log_info "Wählen Sie Ihren DNS-Provider:"
echo "1) Cloudflare"
echo "2) Route53 (AWS)"
echo "3) Manual (manuelle DNS-Einträge)"
echo ""
read -p "Ihre Wahl (1-3): " -n 1 -r
echo ""
case $REPLY in
1)
DNS_PROVIDER="cloudflare"
;;
2)
DNS_PROVIDER="route53"
;;
3)
DNS_PROVIDER="manual"
;;
*)
log_error "Ungültige Auswahl!"
exit 1
;;
esac
# Erstelle Zertifikats-Verzeichnis
if [ ! -d "$CERT_DIR" ]; then
log_info "Erstelle Zertifikats-Verzeichnis: $CERT_DIR"
sudo mkdir -p "$CERT_DIR"
fi
# DNS-Provider spezifische Konfiguration
case $DNS_PROVIDER in
"cloudflare")
log_info "Cloudflare DNS-01 Challenge Setup"
# Prüfe ob Cloudflare Plugin installiert ist
if ! certbot plugins | grep -q cloudflare; then
log_info "Installiere Cloudflare Plugin..."
if command -v apt &> /dev/null; then
sudo apt install -y python3-certbot-dns-cloudflare
elif command -v zypper &> /dev/null; then
sudo zypper install -y python3-certbot-dns-cloudflare
else
log_error "Cloudflare Plugin nicht verfügbar. Installiere manuell."
exit 1
fi
fi
# Erstelle Cloudflare Credentials Datei
log_info "Erstelle Cloudflare Credentials..."
read -p "Cloudflare API Token: " -s CF_TOKEN
echo
CF_CREDENTIALS_FILE="/etc/yourpart/cloudflare.ini"
sudo tee "$CF_CREDENTIALS_FILE" > /dev/null << EOF
dns_cloudflare_api_token = $CF_TOKEN
EOF
sudo chmod 600 "$CF_CREDENTIALS_FILE"
# Erstelle Zertifikat
log_info "Erstelle Let's Encrypt Zertifikat mit Cloudflare DNS-01 Challenge..."
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials "$CF_CREDENTIALS_FILE" \
-d your-part.de \
--non-interactive \
--agree-tos \
--email admin@your-part.de
;;
"route53")
log_info "Route53 DNS-01 Challenge Setup"
# Prüfe ob Route53 Plugin installiert ist
if ! certbot plugins | grep -q route53; then
log_info "Installiere Route53 Plugin..."
if command -v apt &> /dev/null; then
sudo apt install -y python3-certbot-dns-route53
elif command -v zypper &> /dev/null; then
sudo zypper install -y python3-certbot-dns-route53
else
log_error "Route53 Plugin nicht verfügbar. Installiere manuell."
exit 1
fi
fi
# Erstelle Zertifikat
log_info "Erstelle Let's Encrypt Zertifikat mit Route53 DNS-01 Challenge..."
log_warning "Stelle sicher, dass AWS-Credentials konfiguriert sind!"
sudo certbot certonly \
--dns-route53 \
-d your-part.de \
--non-interactive \
--agree-tos \
--email admin@your-part.de
;;
"manual")
log_info "Manuelle DNS-01 Challenge"
log_warning "Sie müssen die DNS-TXT-Einträge manuell erstellen!"
# Erstelle Zertifikat mit manueller Bestätigung
sudo certbot certonly \
--manual \
--preferred-challenges dns \
-d your-part.de \
--agree-tos \
--email admin@your-part.de
;;
esac
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 Script
log_info "Richte automatische Zertifikats-Erneuerung ein..."
RENEWAL_SCRIPT="/etc/yourpart/renew-ssl-dns.sh"
sudo tee "$RENEWAL_SCRIPT" > /dev/null << EOF
#!/bin/bash
# Automatische SSL-Zertifikats-Erneuerung für YourPart Daemon (DNS-01)
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 "$RENEWAL_SCRIPT"
# Füge Cron Job hinzu (täglich um 2:30 Uhr)
(sudo crontab -l 2>/dev/null; echo "30 2 * * * $RENEWAL_SCRIPT") | sudo crontab -
log_success "Automatische Erneuerung eingerichtet (täglich um 2:30 Uhr)"
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 ""
log_success "Let's Encrypt Zertifikat ist produktionsbereit!"
else
log_error "Let's Encrypt Zertifikat konnte nicht erstellt werden!"
exit 1
fi