# Ispconfig 3.1 und LetsEncrypt Renew



## bon (24. Okt. 2016)

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?


----------



## robotto7831a (24. Okt. 2016)

Das geht automatisch, sofern diese über ISPConfig angelegt wurden.


----------



## oNdsen (25. Jan. 2017)

Ü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 (25. Jan. 2017)

/usr/local/ispconfig/server/lib/classes/cron.d/900-letsencrypt.inc.php


----------



## oNdsen (25. Jan. 2017)

Zitat von Till:


> /usr/local/ispconfig/server/lib/classes/cron.d/900-letsencrypt.inc.php


Danke Till, habe ich mittlerweile herausgefunden.
Gibt es vordefinierte Variablen für zB die Domain, damit ich hier gezielt arbeiten kann?


----------



## Till (25. Jan. 2017)

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


----------



## oNdsen (25. Jan. 2017)

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 (25. Jan. 2017)

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).


----------



## oNdsen (25. Jan. 2017)

Ich glaube die von Dir vorgeschlagene Lösung mit dem Check ist die Beste.
Danke Dir!


----------



## nowayback (25. Jan. 2017)

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.


```
#!/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 (25. Jan. 2017)

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!


----------



## suther (27. März 2017)

Magst du den 7 Zeiler hier teilen?


----------



## oNdsen (27. März 2017)

Na klar, sorry.

```
#!/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 (28. März 2017)

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 (29. März 2017)

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.

```
#!/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
```


----------

