Apache mit Zertifikat von Letsencrypt

Schon in seit Jahren gibt es kostenlose Zertifikate von Letsencrypt, jedoch gibt es seit Apache 2.4 ein Modul zum automatischen aktualisieren der Zertifikate. Zusätzliche Software wie der Certbot ist nicht mehr notwendig.

Die Installation von Apache erfolgt aus den Ubuntu Paketen.

sudo apt install apache2

Die notwendigen Modulle für SSL, OCSP Stapling und Modul „MD“ müssen aktiviert werden.

sudo a2enmod ssl md socache_shmcb

Weiterlesen

kostenlose Zertifikate von Letsencrypt

Schon in seit Jahren gibt es Kostenlose SSL Zertifikate von Letsencrypt und seit Ubuntu LTS 18.04 ist die Software in den Paketen enthalten.

Die Installation vom Certbot ist sehr einfach.

sudo apt install certbot

Das Zertifikate für die Domain example.com wird so erstellt.

certbot certonly --standalone --email name@example.com --agree-tos --rsa-key-size 2048 -d example.com -d www.example.com

Mit Hilfe eines Timer wird das Zertifikat automatisch aktualisiert.

systemctl status certbot.timer

Die Überprüfung der Domain (example.com) findet über Port 80 statt, welche frei sein muss. Läuft dort schon ein Webserver, so gibt es eine Fehlermeldungen.

Laufzeit von Zertifikaten mit Check_MK prüfen

Mit diesem BASH Script kann man SSL Zertifikate im PEM Format mit Hilfe von Check_MK Monitoring überprüfen. Dazu erstellen Sie das Script im Verzeichnis /usr/lib/check_mk_agent/local/. Der Check prüft die Laufzeit der Letsencrypt Zertifikate.

vim /usr/lib/check_mk_agent/local/check_certificates.sh

#!/bin/bash
# Plugin Return Codes
# = 0   OK
# = 1   Warning
# = 2   Critical
# = 3   Unknown
#
DIR=/etc/letsencrypt/live/*/
FILTER=$DIR/cert.pem
 
function output {
 NAME=$(basename $1)
 DATE=$(date --date="$2" --iso-8601)
 SUBJECT=$3
 
 TODAY=$(date +%s)
 DATE_I=$(date -d ${DATE} +%s)
 EXPIRATION=$((15 * 24 * 60 * 60)) # 15 days
 
 if [[ -z $SUBJECT ]] ; then
  STATUS=3
  STATUS_TEXT="UNKNOWN"
  TEXT="Empty subject value"
 elif [ ${TODAY} -gt ${DATE_I} ] ; then
  STATUS=2
  STATUS_TEXT="CRITICAL"
  TEXT="Certificate has expired since ${DATE}"
 elif [[ $(expr $TODAY + $EXPIRATION) -gt ${DATE_I} ]] ; then
  STATUS=1
  STATUS_TEXT="WARNING"
  TEXT="Certificate will expire on ${DATE}"
 else
  STATUS=0
  STATUS_TEXT="OK"
  TEXT="Certificate will expire on ${DATE}"
 fi
 
 echo "${STATUS:-1} Certificate_${SUBJECT} Date=${DATE}; Check(${STATUS_TEXT}) - ${TEXT} - ${SUBJECT}"
}
 
function check {
 FILE=$1
 DATE=$(cat ${FILE} |openssl x509 -noout -enddate|cut -d= -f2-)
 SUBJECT=$(cat ${FILE} |openssl x509 -noout -subject|cut -d= -f3-)
 output "$FILE" "$DATE" "$SUBJECT"
}
 
for FILE in $FILTER;
do
  # take action on each certificate file.
  check "$FILE"
done

Kostenlose SSL Zertifikate von Letsencrypt

Letsencrypt hat mit der Registrierung von kostenlosen SSL Zertifikaten begonnen.

Browser wie Google Chrome, Firefox und Microsoft IE werden unterstützt. Google Chrome hat zur Zeit ein Problem mit dem Root CA bei Microsoft Windows XP.

1.) Git Client in Ubuntu installieren

sudo apt-get install git

2.) Installation von Letsencrypt (Github) erstellen

git clone https://github.com/letsencrypt/letsencrypt

3.) Update von Letsencrypt

cd letsencrypt
git pull

3.) SSL Zertifikat erstellen

3.1.) Manueller Betrieb

Im „Manuellen“ Betrieb werden keine Konfigurationen geändert und der Web-Server wird als Pyton Script aus gegeben.

./letsencrypt-auto certonly –manual –email name@domain.de -d domain.de

3.2.) Standalone Betrieb

Im „Standalone“ Betrieb wird keine Konfiguration geänder, jedoch wird ein WebServer auf Port 80 (HTTP) und 443 (HTTPS) gestartet. Für die Verifizierung muß der WebServer unter der Domain „domain.de“ laufen und aus dem Internet erreichbar sein.

./letsencrypt-auto certonly –standalone –email webmaster@domain.de -d domain.de

4.) Konfiguration Zertifikate

Die SSL Zertifikate werden nach erfolgreicher Verifizierung im Verzeichnis „/etc/letsencrypt/live/domain.de/“ gespeichert. Zusatzlich solltem man das „Intermediate“ Zertifikat von Letsencrypt installieren.

Root Zertifikate (CA): https://letsencrypt.org/certificates/

cd /etc/letsencrypt/
wget https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem

4.1.) Einbinden in Apache 2.4.x

Aktivieren wir das Apache SSL Modul und den Virtuellen Host.

sudo a2enmod ssl
sudo a2ensite /etc/apache2/sites-available/default-ssl

Ändern wir die Einstellung von dem Host für das SSL Zertifikat.

sudo vim /etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
 
 SSLEngine On
 SSLHonorCipherOrder On
 SSLProtocol All -SSLv2 -SSLv3
 SSLCipherSuite ALL:!ADH:!EXP:!LOW:!RC2:!3DES:!SEED:!RC4:+HIGH:+MEDIUM
 SSLCertificateFile /etc/letsencrypt/live/domain.de/fullchain.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/domain.de/privkey.pem
 SSLCACertificateFile /etc/letsencrypt/lets-encrypt-x1-cross-signed.pem
 
 BrowserMatch &quot;MSIE [2-6]&quot; \
              nokeepalive ssl-unclean-shutdown \
              downgrade-1.0 force-response-1.0
 BrowserMatch &quot;MSIE [17-9]&quot; ssl-unclean-shutdown
 
 DocumentRoot /var/www/html/
 
</VirtualHost>
</IfModule>

SSLEngine: Aktiviert das SSL/TLS Protokoll für dem virtuellen Host.
SSLCertificateFile: Dies ist der öffentliche Teil des Zertifikat-Schlüssels.
SSLCertificateKeyFile: Dies ist der private Teil des Zertifikats-Schlüssels.
SSLCACertificateFile: Dies enthält das Zertifikat der CA, welche das Zertifikat ausgestellt hat.

Nach der Änderung erfolgt ein Neustart.

sudo service apache2 restart

5.) Aktualisieren der Zertifikate

Die Zertifikate von Letsencrypt sind nur 90 Tage gültig. Für eine automatische Aktualisierung, kann man die Einstellung in der Konfiguration hinterlegen.

sudo ./letsencrypt-auto –config /etc/letsencrypt/cli.ini

sudo vim /etc/letsencrypt/cli.ini

server = https://acme-v01.api.letsencrypt.org/directory
rsa-key-size = 2048
authenticator = standalone
email = webmaster@domain.de
domains = domain.de, www.domain.de
agree-tos = True
renew-by-default = True

Hinweis: Die SSL Anforderung ist auf 10 Abfragen pro Tag und Domain begrenzt.

Quellen:

http://letsencrypt.readthedocs.org/en/latest/using.html