Ispconfig 3.1 und LetsEncrypt Renew

bon

Member
Hallo,
ich habe ein Upgrade auf die aktuelle Ispconfig-Version durchgeführt und mich interessiert ob Ispconfig die LetsEncrypt-Zertifikate automatisch erneuert oder ich einen passenden Cronjob erstellen muss?
 

oNdsen

New Member
Über welchen Cronjob werden die Letsencrypt Zertifikate erneuert?
Ich müsste da noch ergänzen, dass bei einem gewissen Zertifikat auch der Postfix/Dovecot Service neugestartet wird.
 

Till

Administrator
Das ist ja ein cron plugin, das wird also zeitbasiert einmal am Tag aufgerufen und nicht mit einer bestimmten domain.
 

oNdsen

New Member
Auch dies ist mir bewusst. Ich sollte mich wohl etwas besser ausdrücken.
In meinem Fall verwende ich für Dovecot/Postfix das Selbe Zertifikat wie für das Panel selber.
Nun muss ich noch bewerkstelligen das bei einem Zertifikatsrequest nicht nur Apache, sondern auch gleich Postfix und Dovecot neu gestartet werden.
Einen Daily Reboot der Services finde ich schon etwas herbe.
Nun, die Services müssen natürlich auch erst dann neugestartet werden, wenn auch der Request für die entsprechende Domain ausgeführt wird; deshalb die Frage, ob es eine Variable für Domains etc gibt, welche eventuell von ISPConfig übergeben werden.
 

Till

Administrator
ISPConfig hat die info ja auch nicht, es führt ein -n renew aus und schaut ob es ausgeführt wurde in der form das irgendein cert erneuert wurde und startet in dem Fall den apache/nginx neu um es anzuwenden.

Was Du in Deinem Fall vielleicht machen kannst ist dass Du Dir ein kleines shell script schreibst das jede Nacht läuft und schaut ob sich der symlink /etc/letsencrypt/deinedomain.tld/.... im live verzeichnis geändert hat seit dem letzten Aufruf, denn der symlink verweist immer auf das aktuelle cert und wenn der also auf ein neues cert verweist, dann musst Du die Dienste restarten (also außer webserver, das macht ja ispconfig).
 

nowayback

Well-Known Member
Meine Bastellösung (Stand: Gestern ;-))

damit kann ich einfach die zu prüfenden Zertifikate als Parameter übergeben und das Script so schön via Cron 1x am Tag laufen lassen.
Hilft dir evtl.

Code:
#!/bin/bash

#
# Dieses Script prüft ob das Zertifikat welches über den Symlink erreicht wird, neuer ist als 24h.
# Wenn das der Fall ist, werden Postfix und Dovecot neu gestartet, damit das neue Zertifikat verwendet wird.
#

# Programmname speichern
thisprog=$(basename $0)

# Pfad zum Logverzeichnis
logpath="/var/log"

# Name des Logfiles
logfile="check_newlecertificate.log"

# Prüfen ob das Logverzeichnis ein Verzeichnis ist
if [ ! -d "$logpath" ]
    then
        echo "Abbruch: $logpath ist kein Verzeichnis"
        exit
fi

# Pfad zum Logfile vollständig zusammenbauen
logpathfile="$logpath/$logfile"

# Wenn das Logfile nicht existiert, dann versuchen zu erstellen
if [ ! -e "$logpathfile" ]
    then
        echo "Erstelle Logdatei in: $logpathfile"
        if [ ! -r "$logpath" ]
            then
                echo "Abbruch: Kann im Verzeichnis $logpath nicht schreiben"
                exit
        fi

        `touch $logpathfile`
fi


# Prüfen ob das Logfile schreibbar ist
if [ ! -w "$logpathfile" ]
    then
        echo "Abbruch: $logpathfile ist nicht beschreibbar"
        exit
fi

# Schreibe Start des Scripts in das Logfile
echo "`date +%Y-%m-%d\ %H:%M:%S`: Starting $thisprog..." >> "$logpathfile"

# Prüfe ob Argumente übergeben wurden
if [ "$#" -eq 0 ]
    then
        echo "Abbruch: Parameter fehlt"
        echo "Beispiel: ./$thisprog \"/var/www/example.com/ssl/cert1.crt /var/www/example.com/ssl/cert2.crt\""
        echo "`date +%Y-%m-%d\ %H:%M:%S`: Aborting: Missing arguments... Example: ./$thisprog \"/var/www/example.com/ssl/cert1.crt\"" >> "$logpathfile"
        echo "" >> "$logpathfile"
        exit
fi

# Variable für den aktuellen Zeitstempel
# mit 0 vorbelegt um später prüfen zu können ob das Auslesen erfolgreich war
datenow=`date +%s`

# Schreibe Logeintrag mit Anzahl der Parameter
echo "`date +%Y-%m-%d\ %H:%M:%S`: Getting $# arguments..." >> "$logpathfile"

# Hilfsvariable zum Prüfen ob es neue Zertfikate gibt
needrestart=0

while [ "$#" -gt 0 ]
    do
          echo "`date +%Y-%m-%d\ %H:%M:%S`: Processing ${1}" >> "$logpathfile"
      
        # datecert initial auf 0 setzen
        datecert=0

        # Prüfen ob Datei existiert
        if [ -e "${1}" ]
            then
                # Zeitstempel holen
                datecert=`stat "${1}" -L -c %Y`
            else
                echo "`date +%Y-%m-%d\ %H:%M:%S`: Error: File ${1} does not exists" >> "$logpathfile"
        fi

        # Referenzzeit setzen auf jetziger Zeitstempel - 24h01m
        maxagetime=$(( $datenow - 86460 ))
      
        # Prüfen ob ein Zertifikat neuer ist als 24h01m
        if [ "$datecert" -gt "$maxagetime" ]
            then
                needrestart=1
                echo "`date +%Y-%m-%d\ %H:%M:%S`: ${1} is NEW. " >> "$logpathfile"
        fi

        # Prüfen ob needrestart schon 1 ist. Dann können wir uns die restlichen Durchläufe sparen, denn der Mailserver muss so oder so neu gestartet werden
        if [ "$needrestart" -eq 1 ]
            then
                echo "`date +%Y-%m-%d\ %H:%M:%S`: Other given parameters would not be checked. We MUST restart the mailserver because ${1} is new." >> "$logpathfile"
                break
        fi

        # ersten Parameter entfernen und die Schleife erneut durchlaufen bis Anzahl Parameter = 0
        shift
done

# Prüfen ob Neustart nötig ist
if [ "$needrestart" -eq 1 ]
    then
        echo "`date +%Y-%m-%d\ %H:%M:%S`: Restarting Postfix..." >> "$logpathfile"
        `service postfix restart`
        echo "`date +%Y-%m-%d\ %H:%M:%S`: Postfix restarted..." >> "$logpathfile"
        echo "`date +%Y-%m-%d\ %H:%M:%S`: Restarting Dovecot..." >> "$logpathfile"
        `service dovecot restart`
        echo "`date +%Y-%m-%d\ %H:%M:%S`: Dovecot restarted..." >> "$logpathfile"
    else
        echo "`date +%Y-%m-%d\ %H:%M:%S`: Nothing changed..." >> "$logpathfile"
fi

# Schreibe Ende des Scripts in das Logfile
echo "`date +%Y-%m-%d\ %H:%M:%S`: $thisprog finished" >> "$logpathfile"
echo "" >> "$logpathfile"
 

oNdsen

New Member
Vielen lieben Dank für Dein Skript!
Habe mir zwischenzeitlich ne funktionierende Lösung (7 Zeiler) geschrieben, welche nun regelmässig ausgeführt wird.
Komme aber sehr gerne auf Dein Skript zurück, sofern ich eine variablere Lösung benötigen würde!
 

oNdsen

New Member
Na klar, sorry.
Code:
#!/bin/bash

check_cert=/etc/letsencrypt/live/hostname.domain.tld/chain.pem
check_ver_file=./check_version

get_ver=`cat $check_ver_file`
check_ver=`ls -i $check_cert`

if [ "$check_ver" == "$get_ver" ]; then

else
        echo $(date)" [ *** Update available *** ]"
        echo $(date)" Restarting Services"
        echo $(date)" Reloading Apache Config"
        /etc/init.d/apache2 reload
        echo $(date)" Restarting Dovecot"
        /etc/init.d/dovecot restart
        echo $(date)" Restarting Postfix"
        /etc/init.d/postfix restart
        echo $(date)" Restarting FTP Service"
        /etc/init.d/pure-ftpd-mysql restart
        echo $(date)" Updating Version File"
        echo $check_ver > $check_ver_file
        echo $(date)" [ *** Cert Update Done *** ]"
fi

Hatte im ersten Statement erst ein "No Restart needed" drinnen.
Einfach einen Crontab erstellen:
* * * * * /usr/local/sbin/check_cert.sh >> /var/log/ispconfig/check_cert.log

Hoffe das bringt Dich weiter!
Gruss
 

suther

Member
Super, ich danke dir.
ich hatte jetzt das Problem, dass das Mailzertifikat nicht erneuert wurde. Hab es dann letztendlich so gemacht, das ich in ISPConfig für die Subdomain LetsEncrypt deaktiviert und erneut aktiviert habe... dann ging es.
Im nächsten 30 Tage-Zyklus, muss ich der Sache mal tiefer auf den Grund gehen.
 

oNdsen

New Member
Ich hatte das Problem soeben auch.
Denkfehler meinerseits; habe das Script etwas überarbeitet. Es ist nun dynamischer und erstellt direkt auch das entsprechende FTP Zertifikat.
Wichtig hierbei ist einfach, dass der Hostname mit dem LE Zertifikat übereinstimmt.
Code:
#!/bin/bash

le_path=/etc/letsencrypt/live/`hostname -f`

le_chain=${le_path}/chain.pem
ver_file=./current_`hostname -f`_cert

if [ ! -e "$ver_file" ] ; then
    touch "$ver_file"
fi

cur_ver=`cat $ver_file`
le_ver=`ls -i $le_chain`

if ! [ "$cur_ver" = "$le_ver" ]; then
        echo $(date)" [ *** Update available *** ]"
        echo $(date)" Restarting Services"

        echo $(date)" Reloading Apache Config"
        /etc/init.d/apache2 reload

        echo $(date)" Restarting Dovecot"
        /etc/init.d/dovecot restart

        echo $(date)" Restarting Postfix"
        /etc/init.d/postfix restart

        echo $(date)" Restarting FTP Service"
        rm /etc/ssl/private/pure-ftpd.pem
        cat ${le_path}/privkey.pem ${le_path}/fullchain.pem > /etc/ssl/private/pure-ftpd.pem
        chmod 600 /etc/ssl/private/pure-ftpd.pem
        /etc/init.d/pure-ftpd-mysql restart

        echo $(date)" Updating Version File"
        echo $le_ver > $ver_file

        echo $(date)" [ *** Cert Update Done *** ]"
fi
 

Werbung

Top