182 lines
5.8 KiB
Bash
Executable File
182 lines
5.8 KiB
Bash
Executable File
#!/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 |