Files
timemaster/setup-tls-internal.sh
T
patrickandClaude Sonnet 5 f354bddd1e feat(tls): optionales Setup für interne CA vorbereitet
setup-tls-internal.sh: Alternative zu setup-tls.sh für rein internes Netz
ohne öffentliches DNS. Baut einmalig eine interne Root-CA + signiert
Server-Zertifikate damit (openssl, kein Let's Encrypt). Root-CA muss auf
Clients importiert werden, danach keine Browser-Warnung mehr für alle
künftigen intern signierten Server. Nicht ausgeführt, bleibt inaktiv bis
manuell gestartet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LTxkZEUdfgMxZvHPiZJ8bV
2026-08-05 19:36:19 +02:00

84 lines
3.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# =============================================================================
# setup-tls-internal.sh AUF DEM SERVER ausführen (nicht lokal), OPTIONAL
#
# Alternative zu setup-tls.sh für rein internes Netz OHNE öffentliches DNS:
# baut eine eigene interne CA (einmalig) + signiert damit ein Server-
# Zertifikat für diesen Host. Kein Let's Encrypt, kein Internet nötig,
# funktioniert mit internem Hostnamen ODER reiner IP im SAN.
#
# Unterschied zu selbstsigniertem Einzelzertifikat: die CA wird EINMAL auf
# allen Firmengeräten importiert (Browser/OS-Trust-Store), danach zeigt KEIN
# Client mehr eine Warnung auch nicht für weitere, später signierte Server.
#
# Noch NICHT ausgeführt / nicht Teil des Deploys. Erst starten wenn:
# - Server rein intern bleibt (kein öffentliches DNS gewollt), UND
# - Klarheit besteht, welche Geräte die CA importieren sollen (Kiosk-Tablets,
# Mitarbeiter-Laptops, ...) sonst wieder Browser-Warnungen wie bei
# einfachem Self-Signed-Zertifikat.
#
# Usage (Beispiel):
# ./setup-tls-internal.sh timemaster.local 192.168.1.137
# -> erzeugt /etc/nginx/internal-ca/ca.crt (auf Clients zu importieren)
# und /etc/nginx/internal-ca/server.crt + server.key (für nginx)
#
# CA-Gültigkeit hier bewusst lang (10 Jahre) interne CA, kein öffentliches
# Vertrauen, Rotation liegt in eigener Hand. Server-Zertifikat 825 Tage
# (Browser-Maximalgrenze für öffentliche CAs, hier nicht zwingend, aber als
# vernünftige Rotationsfrist übernommen).
# =============================================================================
set -euo pipefail
HOSTNAME_ARG="${1:-}"
IP_ARG="${2:-}"
if [[ -z "$HOSTNAME_ARG" ]]; then
echo "Usage: ./setup-tls-internal.sh <interner-hostname> [ip]" >&2
echo "Beispiel: ./setup-tls-internal.sh timemaster.local 192.168.1.137" >&2
exit 1
fi
CA_DIR="/etc/nginx/internal-ca"
mkdir -p "$CA_DIR"
cd "$CA_DIR"
if [[ ! -f ca.key ]]; then
echo "==> Erzeuge interne Root-CA (einmalig, 10 Jahre gültig)"
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
-subj "/CN=TimeMaster Internal CA" -out ca.crt
echo " Root-CA erzeugt: $CA_DIR/ca.crt"
echo " -> MUSS auf allen Clients als vertrauenswürdige Root importiert werden"
else
echo "==> Bestehende interne CA gefunden, wiederverwendet ($CA_DIR/ca.crt)"
fi
echo "==> Erzeuge Server-Zertifikat für $HOSTNAME_ARG"
SAN="DNS:$HOSTNAME_ARG"
[[ -n "$IP_ARG" ]] && SAN="$SAN,IP:$IP_ARG"
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$HOSTNAME_ARG" -out server.csr
cat > server.ext <<EOF
subjectAltName = $SAN
extendedKeyUsage = serverAuth
EOF
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 825 -sha256 -extfile server.ext
rm -f server.csr server.ext
chmod 600 ca.key server.key
echo ""
echo "==> Fertig. Nächste Schritte:"
echo " 1. $CA_DIR/ca.crt auf Clients importieren (Browser/OS-Trust-Store,"
echo " bei Kiosk-Tablets/MDM zentral verteilen)"
echo " 2. nginx.conf 443-Block ergänzen:"
echo " ssl_certificate $CA_DIR/server.crt;"
echo " ssl_certificate_key $CA_DIR/server.key;"
echo " 3. nginx -t && systemctl reload nginx"
echo ""
echo " Renewal: Skript einfach erneut mit gleichem Hostnamen aufrufen"
echo " (CA bleibt, nur server.crt/server.key werden neu signiert)."