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
In typischen Büroumgebungen muss vorher sichergestellt sein, dass die eigene Domain Adresse aus dem Internet mit http(!), also z.B. http://your.domain.here, für die Prüfung erreichbar ist. Bei dynamischen Internet Adressen kommt man um ein DNAT forwarding der Ports 80 (HTTP und vermutlich auch HTTPS auf Port 443) vom Router zum Server nicht herum. Das ist und bleibt erforderlich um ein gültiges Zertifiakt automatisch zu erhalten. Mittels https:// ist es im Übrigen erst sinnvoll wenn das Zertifikat ausgestellt ist.
In /var/www/html/index.html wird man auch noch eine META Zeile in den Header der Datei index.html einbauen wollen:
<meta http-equiv="refresh" content="0; URL='https://your.domain.here/SOGo'" />