parent
266564cf69
commit
f2050a0ed0
133
LE_Wildcard.sh
133
LE_Wildcard.sh
|
@ -1,73 +1,83 @@
|
|||
#!/bin/bash
|
||||
# /volume1/homes/admin/script/LE_wildcard.sh create
|
||||
|
||||
# 1. Variablen für das Arbeitsverzeichnis, die Domainliste und ggf. die Mailadresse anpassen
|
||||
# 2. das Skript mit dem Parameter 'create' als root aufrufen (die TXT-Records werden erstellt und ausgegeben) /pfad/zu/LE_wildcard.sh create
|
||||
# 3. manuell die TXT-Records beim Anbieter anpassen
|
||||
# 4. das Skript ohne Parameter aufrufen, um das Zertifikat zu erstellen / zu erneuern
|
||||
# ➜ Das Default-Zertifikat des DSM wird erstetzt!
|
||||
# ➜ Ebenso das Zertifikat aller Anwendungen, für die das Defaultzertifikat konfiguriert wurde!
|
||||
|
||||
# einige Quellen:
|
||||
# http://www.stueben.de/lets-encrypt-wildcard/#comment-2208
|
||||
# https://www.howtoforge.de/anleitung/erste-schritte-mit-acmesh-lets-encrypt-ssl-client/
|
||||
# https://itnext.io/synology-lets-encrypt-dns-01-challenge-acme-sh-and-route53-af491786d262
|
||||
# https://vdr.one/how-to-create-a-lets-encrypt-wildcard-certificate-on-a-synology-nas/
|
||||
# https://letsencrypt.org/de/docs/rate-limits/
|
||||
|
||||
#################################################################################################################################
|
||||
# Version 1.1.0 / 2021-10-17 #
|
||||
# - Option für Ausführung über Docker hinzugefügt #
|
||||
# #
|
||||
# HowTo: #
|
||||
# 1. Variablen für das Arbeitsverzeichnis, die Domainliste und ggf. die Mailadresse anpassen #
|
||||
# 2. das Skript mit dem Parameter create als root aufrufen (die TXT-Records werden erstellt und ausgegeben) #
|
||||
# ./pfad/zu/LE_wildcard.sh create #
|
||||
# 3. manuell die TXT-Records beim Anbieter anpassen #
|
||||
# 4. das Skript ohne Parameter aufrufen, um das Zertifikat zu erstellen / zu erneuern #
|
||||
# ./pfad/zu/LE_wildcard.sh #
|
||||
# ➜ Das Default-Zertifikat des DSM wird erstetzt! #
|
||||
# ➜ Ebenso das Zertifikat aller Anwendungen, für die das Defaultzertifikat konfiguriert wurde! #
|
||||
# #
|
||||
# einige Quellen: #
|
||||
# http://www.stueben.de/lets-encrypt-wildcard/#comment-2208 #
|
||||
# https://www.howtoforge.de/anleitung/erste-schritte-mit-acmesh-lets-encrypt-ssl-client/ #
|
||||
# https://itnext.io/synology-lets-encrypt-dns-01-challenge-acme-sh-and-route53-af491786d262 #
|
||||
# https://vdr.one/how-to-create-a-lets-encrypt-wildcard-certificate-on-a-synology-nas/ #
|
||||
# https://letsencrypt.org/de/docs/rate-limits/ #
|
||||
# https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker #
|
||||
# https://youtu.be/8Y1J-0mi5x4 (automatisch erneuern) #
|
||||
# #
|
||||
#################################################################################################################################
|
||||
|
||||
# ----- VARIABLEN ANPASSEN -----
|
||||
WORKPATH="/volume1/homes/admin/_wildcardcert"
|
||||
DOMAINLIST="-d *.domain1.de -d *.domain2.de -d domain1.de -d domain2.de" # jede Domain durch -d definieren!
|
||||
ACCOUNTMAIL="mail@domain.de"
|
||||
|
||||
|
||||
###################################################################################################################
|
||||
WORKPATH="/volume1/homes/<user>/_wildcardcert"
|
||||
DOMAINLIST="-d *.domain1.com -d *.domain2.com -d domain1.com -d domain2.com" # jede Domain durch -d definieren!
|
||||
ACCOUNTMAIL="mail@example.com"
|
||||
ACME_METHOD=acme_docker # über welchen Weg soll acme.sh ausgeführt werden? acme_local oder acme_docker
|
||||
# acme_sh_SOURCE="https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh"
|
||||
acme_sh_SOURCE="https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh"
|
||||
|
||||
#-------------------------------------------------- ab hier nichts mehr ändern --------------------------------------------------
|
||||
|
||||
# CERTPATH: in diesen Verzeichnissen speichert der DSM die Zertifikate
|
||||
# bisher sind mir 2 Verzeichnisse bekannt:
|
||||
CERTPATH=("/usr/local/etc/certificate/" "/usr/syno/etc/certificate/")
|
||||
|
||||
|
||||
# Skript muss als root ausgeführt werden, da sonst kein Zugriff auf die Systemverzeichnisse möglich ist
|
||||
if [ $(whoami) != "root" ]; then
|
||||
echo "WARNUNG: das Skript muss von root ausgeführt werden!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Arbeitsordner ggf. erstellen
|
||||
if [ ! -d "$WORKPATH/LE_CERT-home" ]; then
|
||||
mkdir -p "$WORKPATH/LE_CERT-home"
|
||||
fi
|
||||
cd "$WORKPATH"
|
||||
|
||||
# ToDo: .acme.sh verwendet leider nicht die absoluten Pfadangaben …?
|
||||
# --cert-file "$new_cert" --key-file "$new_privatkey" --ca-file "$new_intermediate_cert" --fullchain-file "$new_full_chain_certs"
|
||||
# der Pfad zu den Dateien wird daher anhand des *.key-Files nach der "cert_create()"-Funktion ausgelesen
|
||||
# new_cert="$WORKPATH/LE_CERT-home/cert-file.cer" # cert
|
||||
# new_privatkey="$WORKPATH/LE_CERT-home/key-file.key" # private-key
|
||||
# new_intermediate_cert="$WORKPATH/LE_CERT-home/ca.cer" # intermediate CA cert
|
||||
# new_full_chain_certs="$WORKPATH/LE_CERT-home/fullchain.cer" # full_chain_certs
|
||||
|
||||
cert_create () {
|
||||
# ----- ZERTIFIKAT VORBEREITEN -----
|
||||
# create (Token für txt-Record):
|
||||
echo "Zertifikatserstellung vorbereiten:"
|
||||
echo "(folge den nachfolgenden Anweisungen im Output für den DNS txt-Record)"
|
||||
# ./acme.sh --force --test --issue --home $WORKPATH --config-home "$WORKPATH" --cert-home "$WORKPATH/LE_CERT-home" --accountemail "${ACCOUNTMAIL}" ${DOMAINLIST} --cert-file "$new_cert" --key-file "$new_privatkey" --ca-file "$new_intermediate_cert" --fullchain-file "$new_full_chain_certs" --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
|
||||
./acme.sh --force --issue --home "$WORKPATH" --config-home "$WORKPATH" --cert-home "$WORKPATH/LE_CERT-home" --accountemail "${ACCOUNTMAIL}" ${DOMAINLIST} --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
|
||||
|
||||
if [ $ACME_METHOD = acme_local ]; then
|
||||
./acme.sh --force --issue --home "$WORKPATH" --config-home "$WORKPATH" --cert-home "$WORKPATH/LE_CERT-home" --accountemail "${ACCOUNTMAIL}" ${DOMAINLIST} --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
|
||||
elif [ $ACME_METHOD = acme_docker ]; then
|
||||
# docker help: https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker
|
||||
docker run --rm -it -v "$WORKPATH":/acme.sh neilpang/acme.sh --home "/acme.sh" --issue ${DOMAINLIST} --config-home "/acme.sh" --cert-home "/acme.sh/LE_CERT-home" --accountemail "${ACCOUNTMAIL}" --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
|
||||
fi
|
||||
exit 0
|
||||
}
|
||||
echo -n "Download acme.sh ➜ "
|
||||
if [ -f ./acme.sh ]; then
|
||||
echo "ok (bereits vorhanden / Version: $(get_key_value ./acme.sh VER))"
|
||||
else
|
||||
wget -q https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh
|
||||
|
||||
if [ $ACME_METHOD = acme_local ]; then
|
||||
echo -n "Download acme.sh ➜ "
|
||||
if [ -f ./acme.sh ]; then
|
||||
echo "ok / Version: $(get_key_value ./acme.sh VER)"
|
||||
chmod a+x acme.sh
|
||||
echo "ok (bereits vorhanden / Version: $(get_key_value ./acme.sh VER))"
|
||||
else
|
||||
echo "fehlgeschlagen - das Skript wird beendet!"
|
||||
exit
|
||||
wget -q "$acme_sh_SOURCE"
|
||||
if [ -f ./acme.sh ]; then
|
||||
echo "ok / Version: $(get_key_value ./acme.sh VER)"
|
||||
chmod a+x acme.sh
|
||||
else
|
||||
echo "fehlgeschlagen - das Skript wird beendet!"
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -89,12 +99,19 @@ cert_create () {
|
|||
|
||||
# ----- ZERTIFIKATE ERSTELLEN / ERNEUERN -----
|
||||
echo -n "erstelle / erneuere das Zertifikat ➜ "
|
||||
# acmeLOG=$(./acme.sh --force --home $WORKPATH --renew ${DOMAINLIST} --config-home "$WORKPATH" --accountemail "${ACCOUNTMAIL}" --cert-file "$new_cert" --key-file "$new_privatkey" --ca-file "$new_intermediate_cert" --fullchain-file "$new_full_chain_certs" --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please )
|
||||
acmeLOG=$(./acme.sh --force --home "$WORKPATH" --renew ${DOMAINLIST} --config-home "$WORKPATH" --cert-home "$WORKPATH/LE_CERT-home" --accountemail "${ACCOUNTMAIL}" --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please )
|
||||
|
||||
if [ $ACME_METHOD = acme_local ]; then
|
||||
# lokale Installation:
|
||||
acmeLOG=$(./acme.sh --log --debug 2 --force --home "$WORKPATH" --renew ${DOMAINLIST} --config-home "$WORKPATH" --cert-home "$WORKPATH/LE_CERT-home" --accountemail "${ACCOUNTMAIL}" --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please )
|
||||
elif [ $ACME_METHOD = acme_docker ]; then
|
||||
# docker help: https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker
|
||||
acmeLOG=$(docker run --rm -it -v "$WORKPATH":/acme.sh neilpang/acme.sh --home "/acme.sh" --renew ${DOMAINLIST} --config-home "/acme.sh" --cert-home "/acme.sh/LE_CERT-home" --accountemail "${ACCOUNTMAIL}" --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please )
|
||||
# --debug und --log stehen im Dockerskript nicht zur Verfügung
|
||||
fi
|
||||
|
||||
# Zertifikatserneuerung OK?:
|
||||
if [ $? = 0 ]; then
|
||||
if echo "$acmeLOG" | grep -q "Add the following TXT record" ; then
|
||||
if echo "$acmeLOG" | grep -q "Add the following TXT record|Please add the TXT records to the domains" ; then
|
||||
echo "! ! ! ACHTUNG ! ! ! TXT-Record muss erneuert werden"
|
||||
echo "folge den nachstehenden Instruktionen und führe anschließend das Skript erneut aus:"
|
||||
echo "$acmeLOG" | sed -e "s/^/ /g"
|
||||
|
@ -120,7 +137,7 @@ copy_cert () {
|
|||
# ➜ startet im Abschluss den Webserver neu
|
||||
|
||||
copy_cert_sub () {
|
||||
# Unterfunktion, da das Defaultzertifikat / Importpfad nicht durch die INFO abgedeckt wird
|
||||
# Unterfunktion, da das Default-Zertifikat / Importpfad nicht durch die INFO abgedeckt wird
|
||||
if [ -d "${TARGETPATH}" ]; then
|
||||
BACKUPPATH="${BACKUPMAINPATH}/${SUBSCRIBER}"
|
||||
echo " Speicherpfad: ➜ $TARGETPATH"
|
||||
|
@ -128,6 +145,7 @@ copy_cert () {
|
|||
if [ ! -d "${BACKUPPATH}" ]; then
|
||||
mkdir -p "${BACKUPPATH}"
|
||||
fi
|
||||
|
||||
# erstelle ein Backup für das aktuelle Verzeichnis
|
||||
rsync -aHcxv "${TARGETPATH}" "${BACKUPPATH}" 2>&1 >/dev/null
|
||||
if [ $? = 0 ]; then
|
||||
|
@ -149,7 +167,7 @@ copy_cert () {
|
|||
cp -f "$new_privatkey" "${TARGETPATH}/privkey.pem"
|
||||
cp -f "$new_intermediate_cert" "${TARGETPATH}/chain.pem"
|
||||
cp -f "$new_full_chain_certs" "${TARGETPATH}/fullchain.pem"
|
||||
|
||||
|
||||
# kopierte Dateien verifizieren:
|
||||
copystate=0
|
||||
if [[ $(/bin/md5sum "$new_cert" | awk '{print $1}') != $(/bin/md5sum "${TARGETPATH}/cert.pem" | awk '{print $1}') ]]; then
|
||||
|
@ -161,13 +179,14 @@ copy_cert () {
|
|||
elif [[ $(/bin/md5sum "$new_full_chain_certs" | awk '{print $1}') != $(/bin/md5sum "${TARGETPATH}/fullchain.pem" | awk '{print $1}') ]]; then
|
||||
copystate=1
|
||||
fi
|
||||
|
||||
if [[ $copystate = 1 ]]; then
|
||||
echo "fehlgeschlagen!"
|
||||
continue
|
||||
else
|
||||
echo "fertig"
|
||||
fi
|
||||
|
||||
|
||||
# Übertrage Dateiattribute:
|
||||
# ToDo: evtl. owner aus INFO übertragen
|
||||
echo -n " Übertrage Dateiattribute ➜ "
|
||||
|
@ -197,8 +216,11 @@ copy_cert () {
|
|||
SERVICE=$(echo "$string" | grep service | awk '{print $2}' | sed -e "s/\"//g ; s/,$//g") # Subordner
|
||||
DISPLAY_NAME=$(echo "$string" | grep "\"display_name\"\:" | awk -F': ' '{print $2}' | sed -e "s/\"//g ; s/,$//g" )
|
||||
|
||||
OWNER=$(echo "$string" | grep owner | awk '{print $2}' | sed -e "s/\"//g ; s/,$//g") # Subordner
|
||||
isPkg=$(echo "$string" | grep isPkg | awk '{print $2}' | sed -e "s/\"//g ; s/,$//g") # Subordner # für Zielverzeichnis
|
||||
|
||||
echo "aktualisiere Zertifikat für >>> ${DISPLAY_NAME} <<<"
|
||||
|
||||
|
||||
# suche das passende Verzeichnis für den Dienst und kopiere Zertifikat
|
||||
# (das passende Elternverzeichnis der einzelnen Dienstezertifikate ist nicht in der INFO hinterlegt, daher muss gesucht werden):
|
||||
for i in ${CERTPATH[@]}; do
|
||||
|
@ -213,18 +235,21 @@ copy_cert () {
|
|||
SERVICE="$(cat /usr/syno/etc/certificate/_archive/DEFAULT)"
|
||||
TARGETPATH="/usr/syno/etc/certificate/_archive/$(cat /usr/syno/etc/certificate/_archive/DEFAULT)"
|
||||
copy_cert_sub
|
||||
|
||||
|
||||
echo "abschließend Webserver neustarten"
|
||||
if [ $(synogetkeyvalue /etc.defaults/VERSION majorversion) -ge 7 ]; then
|
||||
# Neuer Befehl (DSM7)
|
||||
# (DSM7)
|
||||
/usr/bin/systemct restart nginx
|
||||
else
|
||||
# Alter Befehl (DSM6)
|
||||
# (DSM6)
|
||||
/usr/syno/sbin/synoservicectl --reload nginx
|
||||
fi
|
||||
|
||||
echo "kopiere Zertifikat nach Dockercontainer:"
|
||||
/volume3/docker/bitwarden_mprasil/copy_LE_Cert.sh
|
||||
/volume3/docker/gitea/copy_LE_Cert.sh
|
||||
}
|
||||
|
||||
copy_cert
|
||||
|
||||
exit 0
|
||||
|
Loading…
Reference in New Issue