Let's Encrypt mit dehydrated BASH Script
Mit Let's Encrypt ist es nun möglich kostenlose SSL Zertifikate zu bekommen. Diese haben eine Laufzeit von 90 Tagen und müssen deshalb regelmäßig aktualisiert werden. Es gibt diverse Tools und Scripte hierfür, die unter Linux die Zertifikate automatisch generieren und deployen. Das hier verwendete dehydrated ist ein simples BASH Script welches mit den Linux Basics auskommt. Lediglich openssl wird benötigt. Die automatische ausführen geschieht dann per cronjob.
Installation unter Debian Linux
Voraussetzungen installieren:
apt-get install openssl git
Nun kann man sich das toolkit via git saugen:
cd /etc
git clone https://github.com/lukas2511/dehydrated.git
Die Installation läuft wie folgt ab:
mkdir /usr/share/apache2/dehydrated/
cp /etc/dehydrated/docs/examples/hook.sh /etc/dehydrated/
cp /etc/dehydrated/docs/examples/config /etc/dehydrated/
cp /etc/dehydrated/docs/examples/domains.txt /etc/dehydrated/
ln -s /etc/dehydrated/dehydrated /usr/local/sbin/dehydrated
Konfiguration
Die Konfiguration geschieht in den oben kopierten Example Dateien. Ich gehe hier nur auf die Änderungen ein, die zwingend gemacht werden müssen.
/etc/dehydrated/config
IP_VERSION=4 WELLKNOWN="/usr/share/apache2/dehydrated" HOOK="/etc/dehydrated/hook.sh" CONTACT_EMAIL=your@mailadress
Nun die Datei hook.sh
anpassen. Diese Datei ist dafür zuständig was passieren soll, wenn ein Neues Zertifikat ausgestellt wird. Zum Beispiel sollte der Apache neugestartet werden. Oder gar der Mailserver.
/etc/dehydrated/hook.sh
...---
deploy_cert() {
local DOMAIN="${1}" KEYFILE="${2}" CERTFILE="${3}" FULLCHAINFILE="${4}" CHAINFILE="${5}" TIMESTAMP="${6}"
# This hook is called once for each certificate that has been
# produced. Here you might, for instance, copy your new certificates
# to service-specific locations and reload the service.
#
# Parameters:
# - DOMAIN
# The primary domain name, i.e. the certificate common
# name (CN).
# - KEYFILE
# The path of the file containing the private key.
# - CERTFILE
# The path of the file containing the signed certificate.
# - FULLCHAINFILE
# The path of the file containing the full certificate chain.
# - CHAINFILE
# The path of the file containing the intermediate certificate(s).
# - TIMESTAMP
# Timestamp when the specified certificate was created.
# Changes to the example script:
# Apache reload after deploy of a new certificate
systemctl reload apache2
# Mailserver restart after new mail certificate was generated
#if [ "$DOMAIN" = "mail.domain.tld" ]
# then
# systemctl restart postfix dovecot
#fi
}
...----
In der folgenden Datei werden nun noch sämtliche Domains, für die man ein Zertifikat möchte eingetragen. Hierbei gilt, jede Zeile ein Zertifikat mit Domain Aliasen:
/etc/dehydrated/domains.txt
example.com www.example.com example.net www.example.net wiki.example.net
Damit die Zertifizierungsstelle überprüfen kann, ob die Domain einem auch wirklich gehört, muss im Apache der wellknown Ordner für alle Domains freigegeben werden. Deshalb muss ein Alias gesetzt werden. Dafür folgende Apache Config anlegen:
/etc/apache2/conf-available/dehydrated.conf
Alias /.well-known/acme-challenge /usr/share/apache2/dehydrated <Directory /usr/share/apache2/dehydrated> Options None AllowOverride None # Apache 2.x <IfModule !mod_authz_core.c> Order allow,deny Allow from all </IfModule> # Apache 2.4 <IfModule mod_authz_core.c> Require all granted </IfModule> </Directory>
Zertifikate erstellen
Ist alles soweit konfiguriert können die Zertifikate erstellt werden. Dafür muss zuerst der Register bei Let's Encrypt gestartet werden.
/usr/local/sbin/dehydrated --register --accept-terms
Ist dieser erfolgreich durchgelaufen werden die Zertifikate erstellt:
/usr/local/sbin/dehydrated -c -f /etc/dehydrated/config
Automatische verlängern
Einrichtung des Crontabs zum automatischen generieren und deployen der Zertifikate:
crontab -e
# dehydrated 5 2 * * 6 /usr/local/sbin/dehydrated -c -f /etc/dehydrated/config
Konifguration der Apache SSL vhosts
Nun kann das Zertifikat im Webserver eingesetzt werden. In diesem Fall im Apache HTTPd. Die beiden wichtigsten Zeilen sehen wie folgt aus:
SSLCertificateFile /etc/dehydrated/certs/domain.tld/fullchain.pem SSLCertificateKeyFile /etc/dehydrated/certs/domain.tld/privkey.pem
Ein Besipiel SSL vhost könnte so aussehen:
VirtualHost *:443> ServerName domain.tld ErrorLog /var/log/apache2/domain.tld-error.log CustomLog /var/log/apache2/domain.tld-access.log combined DocumentRoot /srv/httpd/vhosts/domain.tld/htdocs/ <Directory /srv/httpd/vhosts/domain.tld/htdocs/> Require all granted AllowOverride None Options -Indexes +FollowSymLinks -Includes -MultiViews </Directory> SSLEngine On SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLProtocol All -SSLv2 -SSLv3 SSLHonorCipherOrder on SSLCertificateFile /etc/dehydrated/certs/domain.tld/fullchain.pem SSLCertificateKeyFile /etc/dehydrated/certs/domain.tld/privkey.pem </VirtualHost>
Konfiguration Dovecot Mail Server
/etc/dovecot/dovecot.conf
# SSL: Global settings. # Refer to wiki site for per protocol, ip, server name SSL settings: # http://wiki2.dovecot.org/SSL/DovecotConfiguration ssl = required verbose_ssl = no ssl_cert = </etc/dehydrated/certs/domain.tld/fullchain.pem ssl_key = </etc/dehydrated/certs/domain.tld/privkey.pem ssl_protocols = !SSLv2 !SSLv3 ssl_cipher_list = ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE$ ssl_prefer_server_ciphers = yes # Dovecot will regenerate dhparams.pem itself, here we ask it to regenerate # with 2048 key length. ssl_dh_parameters_length = 2048
systemctl restart dovecot.service
Konfiguration Postfix Mail Server
/etc/postfix/main.cf
# TLS parameters smtpd_tls_cert_file = /etc/dehydrated/certs/domain.tld/fullchain.pem smtpd_tls_key_file = /etc/dehydrated/certs/domain.tld/privkey.pem smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
systemctl restart postfix