Files
zwischenablage-server/nginx/40-selfsigned-cert.sh
T
2026-10-16 15:55:14 +02:00

49 lines
1.6 KiB
Bash

#!/bin/sh
# Erzeugt ein selbstsigniertes Zertifikat aus den CERT_*-Werten der .env.
# Neu erzeugt wird, wenn es fehlt, die CERT_*-Werte geaendert wurden oder es
# in weniger als CERT_RENEW_DAYS Tagen ablaeuft.
# Eigene Zertifikate: fullchain.pem + privkey.pem ins Zertifikatsverzeichnis legen
# und die Datei .selfsigned dort loeschen - dann wird nichts ueberschrieben.
set -eu
DIR=/etc/nginx/certs
CRT=$DIR/fullchain.pem
KEY=$DIR/privkey.pem
MARK=$DIR/.selfsigned
CN=${CERT_CN:-localhost}
DAYS=${CERT_DAYS:-825}
RENEW=${CERT_RENEW_DAYS:-30}
SAN=${CERT_SAN:-DNS:$CN}
SUBJ="/C=${CERT_COUNTRY:-DE}/ST=${CERT_STATE:-Bayern}/L=${CERT_CITY:-Muenchen}/O=${CERT_ORG:-NetClip}/OU=${CERT_OU:-IT}/CN=$CN"
CONF="$SUBJ|$SAN|$DAYS|${CERT_KEY_BITS:-2048}"
mkdir -p "$DIR"
if [ -f "$CRT" ] && [ -f "$KEY" ] && [ ! -f "$MARK" ]; then
echo "cert: eigenes Zertifikat in $DIR gefunden, wird verwendet"
exit 0
fi
need=0
if [ ! -f "$CRT" ] || [ ! -f "$KEY" ]; then
need=1
elif [ "$(cat "$MARK")" != "$CONF" ]; then
echo "cert: CERT_*-Werte geaendert"
need=1
elif ! openssl x509 -checkend $((RENEW * 86400)) -noout -in "$CRT" >/dev/null; then
echo "cert: Zertifikat laeuft in weniger als $RENEW Tagen ab"
need=1
fi
if [ "$need" = 1 ]; then
echo "cert: erzeuge selbstsigniertes Zertifikat fuer $CN ($SAN), $DAYS Tage gueltig"
openssl req -x509 -nodes -newkey "rsa:${CERT_KEY_BITS:-2048}" -sha256 \
-days "$DAYS" -subj "$SUBJ" -addext "subjectAltName=$SAN" \
-keyout "$KEY" -out "$CRT"
chmod 600 "$KEY"
printf '%s' "$CONF" > "$MARK"
fi
openssl x509 -noout -subject -enddate -in "$CRT" | sed 's/^/cert: /'