#!/bin/bash # SSL-Konfiguration für DOCX Template Server echo "🔐 SSL-Konfiguration für DOCX Template Server" echo "=============================================" # Funktion für Self-Signed Zertifikat generate_self_signed() { local domain="${1:-localhost}" local days="${2:-365}" echo "📝 Generiere selbstsigniertes Zertifikat für: $domain" mkdir -p ssl cd ssl # Erstelle SSL-Konfigurationsdatei mit SAN cat > ssl.conf << EOF [req] distinguished_name = req_distinguished_name req_extensions = v3_req prompt = no [req_distinguished_name] C=DE ST=Germany L=City O=DOCX Template Server CN=$domain [v3_req] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = localhost DNS.2 = *.localhost IP.1 = 127.0.0.1 IP.2 = 192.168.0.12 IP.3 = ::1 EOF # Generiere private Key openssl genrsa -out key.pem 4096 # Generiere Certificate Signing Request mit SAN openssl req -new -key key.pem -out csr.pem -config ssl.conf # Generiere selbstsigniertes Zertifikat mit SAN openssl x509 -req -in csr.pem -signkey key.pem -out cert.pem -days $days -extensions v3_req -extfile ssl.conf # Aufräumen rm csr.pem echo "✅ SSL-Zertifikat mit SAN erstellt:" echo " 🔑 Privater Schlüssel: ssl/key.pem" echo " 📜 Zertifikat: ssl/cert.pem" echo " 📅 Gültig für: $days Tage" echo " 🌐 Domain: $domain" echo " 🔗 Zusätzliche IPs: 127.0.0.1, 192.168.0.12" } # Funktion für Let's Encrypt (Production) setup_letsencrypt() { local domain="$1" local email="$2" if [ -z "$domain" ] || [ -z "$email" ]; then echo "❌ Domain und E-Mail erforderlich für Let's Encrypt" echo "Verwendung: $0 letsencrypt your-domain.com your-email@domain.com" return 1 fi echo "🌐 Richte Let's Encrypt für $domain ein..." # Installiere certbot falls nicht vorhanden if ! command -v certbot &> /dev/null; then echo "📦 Installiere certbot..." apt-get update && apt-get install -y certbot fi # Stoppe Server temporär für Zertifikat-Erstellung echo "⏸️ Stoppe Server für Zertifikat-Erstellung..." pkill -f "node server.js" 2>/dev/null || true # Erstelle Let's Encrypt Zertifikat certbot certonly --standalone \ --email "$email" \ --agree-tos \ --no-eff-email \ -d "$domain" if [ $? -eq 0 ]; then # Kopiere Zertifikate in ssl/ Ordner mkdir -p ssl cp "/etc/letsencrypt/live/$domain/privkey.pem" ssl/key.pem cp "/etc/letsencrypt/live/$domain/fullchain.pem" ssl/cert.pem echo "✅ Let's Encrypt Zertifikat installiert!" echo "🔄 Auto-Renewal eingerichtet" # Richte Auto-Renewal ein echo "0 12 * * * /usr/bin/certbot renew --quiet && cp /etc/letsencrypt/live/$domain/privkey.pem /home/nodejs/ssl/key.pem && cp /etc/letsencrypt/live/$domain/fullchain.pem /home/nodejs/ssl/cert.pem && pkill -f 'node server.js' && cd /home/nodejs && node server.js > server.log 2>&1 &" | crontab - else echo "❌ Let's Encrypt Zertifikat-Erstellung fehlgeschlagen" return 1 fi } # Funktion für Zertifikat-Info cert_info() { if [ -f "ssl/cert.pem" ]; then echo "📋 SSL-Zertifikat Informationen:" echo "================================" openssl x509 -in ssl/cert.pem -text -noout | grep -A 5 -B 5 -E "(Subject:|Issuer:|Not Before|Not After|DNS:|IP Address:|CN=)" echo "" echo "🔍 Zertifikat-Details:" openssl x509 -in ssl/cert.pem -noout -dates -subject -issuer else echo "❌ Kein SSL-Zertifikat gefunden in ssl/cert.pem" fi } # Hauptmenü case "$1" in "self-signed") domain="${2:-localhost}" days="${3:-365}" generate_self_signed "$domain" "$days" ;; "letsencrypt") setup_letsencrypt "$2" "$3" ;; "info") cert_info ;; "test") echo "🧪 Teste SSL-Konfiguration..." if [ -f "ssl/cert.pem" ] && [ -f "ssl/key.pem" ]; then echo "✅ SSL-Dateien gefunden" openssl x509 -in ssl/cert.pem -noout -checkend 86400 && echo "✅ Zertifikat ist gültig" || echo "⚠️ Zertifikat läuft bald ab" else echo "❌ SSL-Dateien nicht gefunden" fi ;; "remove") echo "🗑️ Entferne SSL-Zertifikate..." rm -rf ssl/ echo "✅ SSL-Zertifikate entfernt" ;; "help"|"") echo "SSL-Konfiguration für DOCX Template Server" echo "" echo "Verwendung: $0 [KOMMANDO] [OPTIONEN]" echo "" echo "Kommandos:" echo " self-signed [domain] [tage] - Erstelle selbstsigniertes Zertifikat" echo " letsencrypt domain email - Richte Let's Encrypt ein (Production)" echo " info - Zeige Zertifikat-Informationen" echo " test - Teste SSL-Konfiguration" echo " remove - Entferne alle SSL-Zertifikate" echo " help - Diese Hilfe anzeigen" echo "" echo "Beispiele:" echo " $0 self-signed localhost 365" echo " $0 self-signed my-server.local 30" echo " $0 letsencrypt example.com admin@example.com" echo " $0 info" echo "" echo "Hinweise:" echo " - Selbstsignierte Zertifikate sind nur für Entwicklung/interne Nutzung" echo " - Let's Encrypt ist für öffentliche Domains mit Internet-Zugang" echo " - Zertifikate werden in ssl/ Ordner gespeichert" ;; *) echo "❌ Unbekanntes Kommando: $1" echo "Verwende '$0 help' für Hilfe" exit 1 ;; esac