#!/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: /'