49 lines
1.6 KiB
Bash
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: /'
|