Let's Encrypt mit dehydrated BASH Script

Aus Laub-Home Wiki

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

Quellen