Zentyal mit Zertifikat von letsencrypt fit machen
Es gefällt nicht allen Anwendern erst mal ein Zertifikat mit Warnhinweisen zu akzeptieren - auch wenn selbst erstellte Zertifikate meist die Funktionalität erfüllen. Gute Dienste leisten hier die freien Zertifikate der Mozilla Gruppe durch die letsencrypt Funktionalität. Zentyal setzt in Zusammenarbeit mit Ubuntu auf allem, was man üblicherweise in der Server Umgebung einer Bürolandschaft braucht, auf - und ein offizielles Zertifikat holt dann das folgende Skript.
Besonders die offiziellen Services, wie das Webmail Interface von SOGo, der SMTP Mailer postfix und der Mail Server dovecot werden angenehmer für Benutzer wenn ein Zertifikat bereits geprüft werden kann. Das kleine Skript hilft den Task umzusetzen, es muss einmal angepasst werden um eine gültige und von außen erreichbare Domain anzugeben. Günstiger Weise wird das bereits der Hostname des Zentyal Servers sein, da dann auch der Name intern für das Büro bereits gleich ist - sonst hilft man mit einem DNS Eintrag sowohl im offiziellen DNS (außen) als auch im Zentyal nach. Im folgenden Skript setzt man den eigenen Domain Namen ein und macht es mit chmod 750 /usr/local/sbin/check-letsencrypt ausführbar. Der erste Aufruf sorgt dafür, dass das entsprechende Environment zur Verfügung gestellt wird bzw. dient es auch als Sanitizer. Als Standalone Lösung ist es hierfür nicht erforderlich die Konfigurationsdateien anzupassen oder die Zentyal Skript Abläufe zu verändern.
/usr/local/sbin/check-letsencrypt
#!/bin/bash # Author: Markus Neubauer (at) std - service . com # Purpose: Setup a valid certificate in Zentyal for official services. # This script is a FAF technic (i.e. Fire And Forget technic), # so call it once interactive on a Zentyal 5 server. # Version: 1.02 / 2018-03-07 # Modified: 1.03 / 2018-03-27 (honor /etc/ssl/private for apache) # License: de: https://www.gnu.org/licenses/gpl-3.0.de.html # en: https://www.gnu.org/licenses/gpl-3.0.en.html # es: https://www.gnu.org/licenses/gpl-3.0.ca.html # YOU HAVE TO CHANGE THE VARIABLE "THIS_DOMAIN" BELOW # and choose your favorite day for the re-checks. # MODIFY THESE TWO LINES THIS_DOMAIN='your.domain.here' FAVORITE_DAY=3 # cert renewal will occur on wednesdays only if neeeded # renewal task AUTO_UPDATER=/etc/cron.daily/letsencrypt-check declare -A CRT_TARGET CRT_TARGET['apache']=/etc/ssl/certs/ssl-cert-snakeoil CRT_TARGET['postfix']=/etc/postfix/sasl/postfix CRT_TARGET['dovecot']=/etc/dovecot/private/dovecot # SANITIZE SCRIPT PRESEEDINGS if [ 'your.domain.here' == "${THIS_DOMAIN}" ]; then echo " Modify THIS_DOMAIN ~ '${THIS_DOMAIN}' in script and recall $0" >&2 exit 99 fi EXE=`which letsencrypt` if [ -z "${EXE}" ]; then EXE=`which certbot` fi if [ -z "${EXE}" ]; then apt install letsencrypt -y EXE=`which letsencrypt` fi if [ -z "${EXE}" ]; then cat << END_OF_ERROR >&2 ERROR: no LETSENCRYPT functionality found # Check your installation and manually try: apt install letsencrypt # then return and call ${0} END_OF_ERROR exit 97 fi # CHECK CERTIFICATE STATUS # Before using the renew function get a new one: if [ ! -d /etc/letsencrypt/live/${THIS_DOMAIN} ]; then ${EXE} certonly -a webroot --webroot-path=/var/www/html -d ${THIS_DOMAIN} elif [ "`date +'%w'`" == "${FAVORITE_DAY}" ]; then # it's wednesday # check once a month for renewal ${EXE} renew -n fi MD5SUM="`md5sum /etc/letsencrypt/live/${THIS_DOMAIN}/fullchain.pem`" if [ -z "${MD5SUM}" ]; then cat << END_OF_ERROR >&2 ERROR: No official certificate found, check your setup! # Check your router to forward http traffic on Port 80. # Goto to http://${THIS_DOMAIN} from an external Browser. # Check finally using a manual call and watch errors: ${EXE} certonly -a webroot --webroot-path=/var/www/html -d ${THIS_DOMAIN} END_OF_ERROR exit 98 fi # SET APACHE CERT function apache_cert() { cp /etc/letsencrypt/live/${THIS_DOMAIN}/fullchain.pem ${TARGET}.pem md5sum ${TARGET}.pem > ${TARGET}.pem.md5sum echo "${MD5SUM}" > ${TARGET}.le.md5sum # swap to private dir TARGET=`echo ${TARGET} | sed "s#/certs/#/private/#"` cp /etc/letsencrypt/live/${THIS_DOMAIN}/privkey.pem ${TARGET}.key apachectl graceful && echo "Apache reloaded ..." # SET NGINX CERT SAME WAY nginx -s reload && echo "Nginx reloaded ..." } # SET POSTFIX CERT function postfix_cert() { cp /etc/letsencrypt/live/${THIS_DOMAIN}/fullchain.pem ${TARGET}.pem cat /etc/letsencrypt/live/${THIS_DOMAIN}/privkey.pem >> ${TARGET}.pem md5sum ${TARGET}.pem > ${TARGET}.pem.md5sum echo "${MD5SUM}" > ${TARGET}.le.md5sum postfix reload && echo "Postfix reloaded ..." } # SET DOVECOT CERT function dovecot_cert() { cp /etc/letsencrypt/live/${THIS_DOMAIN}/fullchain.pem ${TARGET}.pem cat /etc/letsencrypt/live/${THIS_DOMAIN}/privkey.pem >> ${TARGET}.pem md5sum ${TARGET}.pem > ${TARGET}.pem.md5sum echo "${MD5SUM}" > ${TARGET}.le.md5sum doveadm reload && echo "Dovecot reloaded ..." } # MAIN LOOP - CERT STATUS CHECK for DEST in "${!CRT_TARGET[@]}" do echo -n "Checking ${DEST} cert status - " TARGET=${CRT_TARGET[$DEST]} CRTSUM="`md5sum ${TARGET}.pem`" if [ -f ${TARGET}.pem.md5sum ]; then CHKSUM="`cat ${TARGET}.pem.md5sum`" else ${DEST}_cert ${TARGET} continue fi if [ -f ${TARGET}.le.md5sum ]; then LE_SUM="`cat ${TARGET}.le.md5sum`" else ${DEST}_cert ${TARGET} continue fi if [ "${LE_SUM}" != "${MD5SUM}" ] || [ "${CHKSUM}" != "${CRTSUM}" ]; then ${DEST}_cert ${TARGET} continue fi echo "${DEST} cert status ok." done # SETUP/CHECK CRON JOB ENTRY TO CONTINUE THE CHAIN # Sanitizer again if [ ! -f ${AUTO_UPDATER} ]; then cat << END_OF_SCRIPT > ${AUTO_UPDATER} #!/bin/sh # # letsencrypt renewal task # # This script updates certificates if due for renewal # test -x $0 || exit 0 ${0} ## eof END_OF_SCRIPT chmod 750 ${AUTO_UPDATER} echo "Update script installed at ${AUTO_UPDATER}" fi ## eof