OfficeServer/ssl-config.sh
2025-10-01 19:55:38 +02:00

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