Der 4. Teil meiner Artikelserie beschäftigt sich mit den Sicherheitseinstellungen des Apache Servers, sowie der Konfiguration des Let’s Encrypt Clients und der Einrichtung einer automatischen Zertifikatserneuerung. Die Grundkonfiguration des Apache Servers und die erste Erstellung eines Let’s Encrypt Zertifikates haben wir im 3. Teil der Artikelserie besprochen. Nun wollen wir uns die Konfiguration des Apache und des Let’s Encrypt Clients noch im Details anschauen. Zunächst betrachten wir die Konfiguration für unsere Default HTTPS Seite, die der Let’s Encrypt Client erzeugt hat.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | $ cat /etc/apache2/sites-enabled/000-default-le-ssl.conf <IfModule mod_ssl.c> <VirtualHost *:443> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.example.com ServerAdmin webmaster@mydomain.tld DocumentRoot /var/www/html # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf SSLCertificateFile /etc/letsencrypt/live/mysubdomain.mydomain.tld/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/mysubdomain.mydomain.tld/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf ServerName mysubdomain.mydomain.tld SSLCertificateChainFile /etc/letsencrypt/live/mysubdomain.mydomain.tld/chain.pem </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet </IfModule> |
Wir sehen, dass der Let’s Encrypt Client das Zertifikatfile, das Schlüsselfile, ein File für die Zertifikatskette sowie einen Server Namen eingetragen hat. Eine HTTPS Konfiguration ohne Servernamen ist sinnlos, da das Serverzertifikat hier für einen bestimmten Servernamen ausgestellt wurde. Schliesslich hat der Let’s Encrypt Client noch eine Include Anweisung eingefügt. Die Datei /etc/letsencrypt/options-ssl-apache.conf enthält zusätzliche Anweisungen zur ssl Konfiguration.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # Baseline setting to Include for SSL sites SSLEngine on # Intermediate configuration, tweak to your needs SSLProtocol all -SSLv2 -SSLv3 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 SSLHonorCipherOrder on SSLCompression off SSLOptions +StrictRequire # Add vhost name to log entries: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common #CustomLog /var/log/apache2/access.log vhost_combined #LogLevel warn #ErrorLog /var/log/apache2/error.log # Always ensure Cookies have "Secure" set (JAH 2012/1) #Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4" |
Diese Datei passen wir nun noch an unsere Anforderungen an. Hierbei sind verschiedene Anfoderungen zu berücksichtigen. Auf der einen Seite wollen wir eine möglichst sichere Konfiguration, auf der anderen Seite schränken wir damit den Zugriff auf moderne Browser und Clientprogramme ein. Hier ist ein vernünftiger Kompromiss zu suchen. Zunächst erstellen wir aber eine möglichst sichere Konfiguration. Für Hintergrundinfomationen zu den hier verwendeten Einstellungen findet man in der technischen Richtlinie TR-02102-2 zur Verwendung von Transport Layer Security (TLS) des BSI und der RFC 7525: Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) der Internet Engineering Task Force IETF.
Als Protokoll lassen wir nur TLSv1.2 zu, die entsprechende Zeile sieht dann aus wie folgt:
1 | SSLProtocol all -TLSv1.1 -TLSv1 -SSLv2 -SSLv3 |
oder alternativ so:
1 | SSLProtocol TLSv1.2 |
Als Ciphersuites werden nur Varianten mit 256 bit Verschlüsselungslänge verwendet. Damit sieht die Zeile für die Ciphersuite wie folgt aus:
1 | SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA |
Als nächstes entfernen wir das Kommentarzeichen in der letzten Zeile, damit Cookies ebenfalls immer als sicher gekennzeichnet werden.
1 | Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4" |
Zuletzt wollen wir noch „HTTP Strict Transport Security“ HSTS konfigurieren. Dazu ergänzen wir die Konfigurationsdatei am Ende mit den folgenden beiden Zeilen:
1 2 | # HTTP Strict Transport Security, HSTS Header always set Strict-Transport-Security "max-age=31536000" |
Damit sieht unsere Datei /etc/letsencrypt/options-ssl-apache.conf jetzt wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # Baseline setting to Include for SSL sites SSLEngine on # Intermediate configuration, tweak to your needs # Let's Encrypt default #SSLProtocol all -SSLv2 -SSLv3 # really secure SSLProtocol all -TLSv1.1 -TLSv1 -SSLv2 -SSLv3 # Let's Encrypt default #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 # really secure SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA SSLHonorCipherOrder on SSLCompression off SSLOptions +StrictRequire # Add vhost name to log entries: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common #CustomLog /var/log/apache2/access.log vhost_combined #LogLevel warn #ErrorLog /var/log/apache2/error.log # Always ensure Cookies have "Secure" set (JAH 2012/1) Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4" # HTTP Strict Transport Security, HSTS Header always set Strict-Transport-Security "max-age=31536000" |
Die letzten beiden Anweisungen benötigen das Headers Modul des Apache servers, weshalb wir das Headers Modul noch aktivieren und anschließend den Apache restarten müssen.
1 2 3 4 5 6 | $ a2enmod headers Enabling module headers. To activate the new configuration, you need to run: service apache2 restart $ service apache2 restart * Restarting web server apache2 |
Nun werden wir die Sicherheit unseres Servers mit zwei Online-Testsuiten für SSL Server untersuchen. Als erstes nutzen wir den SSL Server Test der Qualys SSL Labs. Dazu tragen wir auf der SSL Server Test Seite unsere Domain ein, setzen gegebenenfalls das Häkchen bei „Do not show the results on the boards“ und klicken den Submit Button. Der Test dauert mehr als eine Minute. Wenn der Testdurchlauf beendet ist gibt er uns einen detailierten Bericht zu unserem Webserver.
Wie wir sehen haben wir ein Overall Rating A+ und nur beim Key Exchange fehlen uns 10 von 100 Punkten. Details zur Bewertung sind im SSL Server Rating Guide nachzulesen.
Wenn wir jetzt nach unten scrollen finden wir unter Configuration den Abschnitt Handshake Simulation.
Hier sehen wir, dass wir mit unserer Konfiguration einige Browser, bzw. Clients vom Zugriff auf unsere Webpage ausschließen. Details zu den Clients findet man unter den jeweiligen Links.
Bevor wir über Anpasssungen unserer Konfiguration sprechen schauen wir uns das Ergebnis einer weitere Testsuite an. Die High-Tech Bridge SA stellt mit ihrem Free SSL Server Test ebenfalls eine Testseite zur Verfügung. Auf dieser Seite geben wir ebenfalls unsere Domain ein, setzen gegebenenfalls das Häkchen bei „Do not display test results in statistics“ und klicken dann auf das blaue Dreieck im Domainnamenfeld. Der Test dauert ebenfalls etwa eine Minute und auch hier erhalten wir einen ausführlichen Bericht, der allerdings etwas andere Schwerpunkte setzt.
Hier erhalten wir FINAL GRADE A und wir können den Bericht als PDF herunterladen. Dokumentation zu den durchgeführten Tests finden wir unter den beiden Links im Kasten „SSL/TLS Security Test by High-Tech Bridge„. Wenn wir weiter nach unten scrollen, sehen wir im Abschnitt „Test For Compliance With NIST Guidelines„, dass unsere Konfiguration in einigen Punkten nicht den NIST Guidelines entspricht.
Laut NIST Guidelines sollten wir TLSv1.1 einschalten und weitere CIPHERS konfigurieren. Deshalb nehmen wir nun nochmals Änderungen an unserer Konfiguration vor und testen anschließend nochmals mit beiden Testsuites.
Unsere Konfiguration sieht nun wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # Baseline setting to Include for SSL sites SSLEngine on # Intermediate configuration, tweak to your needs # Let's Encrypt default #SSLProtocol all -SSLv2 -SSLv3 #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 # really secure #SSLProtocol all -TLSv1.1 -TLSv1 -SSLv2 -SSLv3 #SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA # NIST recommended SSLProtocol all -TLSv1 -SSLv2 -SSLv3 SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:AES128-GCM-SHA256:AES128-SHA: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 SSLHonorCipherOrder on SSLCompression off SSLOptions +StrictRequire # Add vhost name to log entries: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common #CustomLog /var/log/apache2/access.log vhost_combined #LogLevel warn #ErrorLog /var/log/apache2/error.log # Always ensure Cookies have "Secure" set (JAH 2012/1) Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4" # HTTP Strict Transport Security, HSTS Header always set Strict-Transport-Security "max-age=31536000" |
Unsere beiden ursprünglichen Konfigurationen habe ich behalten, mit einem Kommentar versehen und auskommentiert. Wir können also bei Bedarf schnell zwischen den Konfiguationen wechseln.
Nun wiederholen wir die beiden Tests, zunächst den Free SSL Server Test.
Jetzt erhalten wir FINAL GRADE A+, sehr schön! Wir scrollen weiter nach unten und schauen uns die Abschnitte „Test For Compliance With NIST Guidelines„und „Test For Industry Best-Practices“ an.
Die einzigen beiden Schwachstellen sind das Fehlen von OCSP Stapling und HTTP-Public-Key-Pinning (HPKP). Mit beiden Erweiterungen werden wir uns in einem späteren Artikel beschäftigen.
Nun werfen wir noch einen Blick auf die Ergebnisse unserer Testergebnisse bei Qualys SSL Labs.
Das Overall Rating A+ ist uns erhalten geblieben. Im Rating für den Protocol Support haben wir 5 und in der Cipher Strength 10 Punkte verloren. Insgesamt aber immer noch ein gutes Ergebnis. Nun werfen wir noch einen Blick auf den Abschnitt Configuration.
Wir sehen, es sind immer noch eine ganze Reihe älterer Clients vom Zugriff auf unsere Seite ausgeschlossen. In den meisten dieser Fälle ist das Fehlen des TLSv1 Protokolls in unserer Konfiguration verantwortlich. Detailierte Informationen zu den Clients findet man unter den jeweiligen Links. Falls das TLSv1 Protokoll benötigt wird, können wir es in unserer Konfiguration aktivieren, ohne die A+ Bewertung zu verlieren. In meinem Falle möchte ich die Konfiguration zunächst so belassen.
Nun wollen wir noch eine automatische Erneuerung unserer Let’s Encrypt Zertifikate konfigurieren. Zunächst legen wir eine Konfigurationdatei für Let’s Enrypt im Verzeichnis /etc/letsencrypt an. Dazu kopieren wir die Beispielkonfiguration /root/letsencrypt/examples/cli.ini in das Verzeichnis /etc/letsencrypt und passen sie an unsere Bedürfnisse an.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # This is an example of the kind of things you can do in a configuration file. # All flags used by the client can be configured here. Run Let's Encrypt with # "--help" to learn more about the available options. # Use a 4096 bit RSA key instead of 2048 rsa-key-size = 2048 # Uncomment and update to register with the specified e-mail address email = whoever@whereever.de # Uncomment and update to generate certificates for the specified # domains. # domains = example.com, www.example.com # Uncomment to expand the cert with additional names # expand = True # Uncomment to use a text interface instead of ncurses # text = True # Uncomment to use the standalone authenticator on port 443 # authenticator = standalone # standalone-supported-challenges = tls-sni-01 # Uncomment to use the webroot authenticator. Replace webroot-path with the # path to the public_html / webroot folder being served by your web server. # authenticator = webroot # webroot-path = /usr/share/nginx/html |
Ich habe hier nur meine E-Mail Adresse eingetragen, alles Andere steuere ich über Kommandozeilenparameter des Let’s Encrypt Wrapperscripts.
Danach wechseln wir in unser Home Verzeichnis und legen dort ein Verzeichnis „bin“ an.
1 2 | $ cd $ mkdir bin |
In diesem Verzeichnis legen wir ein Script letsencrypt-updatecerts.sh mit dem folgenden Inhalt an.
1 2 3 4 5 | $ cat /root/bin/letsencrypt-updatecerts.sh #!/bin/bash cd /root/letsencrypt ./letsencrypt-auto certonly -c /etc/letsencrypt/cli.ini --verbose --non-interactive --apache -d mysubdomain.mydomain.tld |
Anschließend setzen wir noch die Permissions.
1 | $ chmod 700 /root/bin/letsencrypt-updatecerts.sh |
Jetzt führen wir einen Testlauf unseres Scripts durch.
1 2 3 4 5 6 7 | $ /root/bin/letsencrypt-updatecerts.sh Checking for new version... Requesting root privileges to run letsencrypt... /root/.local/share/letsencrypt/bin/letsencrypt --no-self-upgrade certonly -c /etc/letsencrypt/cli.ini --verbose --non-interactive --apache -d mysubdomain.mydomain.tld 2016-02-24 16:41:02,846:INFO:letsencrypt.cli:Saving debug log to /var/log/letsencrypt/letsencrypt.log 2016-02-24 16:41:03,199:INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org 2016-02-24 16:41:03,426:INFO:letsencrypt.cli:Cert not yet due for renewal |
Das sieht zunächst einmal gut aus. Unser Zertifikat ist noch nicht zur Erneuerung fällig. Abschließend legen wir einen crontab Eintrag an, der das Script einmal Montags um 1:33 Uhr ausführt.
Am einfachsten rufen wir dazu „crontab -e“ auf und ergänzen am Ende der Datei die folgende Zeile:
1 | 33 1 * * 1 /root/bin/letsencrypt-updatecerts.sh |
Dann speichern wir ab und überprüfen mit „crontab -l“, ob der Eintrag korrekt ist. Die Meldungen, die das Script bei der Ausführung ausgibt, werden an den Benutzer, in diesem Falle „root“, gemailt. Dadurch haben wir die Kontrolle über auftretende Fehler.
Wie sich nach dem ersten Cronjeb Lauf des Let’s Encrypt Clinets zeigt funktioniert der Aufruf aus dem Cronjob, so wie wir ihn angegeben haben, leider nicht. Es tritt ein Fehler auf, der Client findet das apache plugin nicht. Warum das Problem nur beim Cronjob auftaucht ist mir ein Rätsel.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | $ cat /var/log/letsencrypt/letsencrypt.log.7 2016-03-14 01:33:03,781:DEBUG:letsencrypt.cli:Root logging level set at 20 2016-03-14 01:33:03,782:INFO:letsencrypt.cli:Saving debug log to /var/log/letsencrypt/letsencrypt.log 2016-03-14 01:33:03,782:DEBUG:letsencrypt.cli:letsencrypt version: 0.4.2 2016-03-14 01:33:03,782:DEBUG:letsencrypt.cli:Arguments: ['-c', '/etc/letsencrypt/cli.ini', '--verbose', '--non-interactive', '--apache', '--expand', '-d', 'mydomain.mysubdomain.tld'] 2016-03-14 01:33:03,782:DEBUG:letsencrypt.cli:Discovered plugins: PluginsRegistry(PluginEntryPoint#apache,PluginEntryPoint#webroot,PluginEntryPoint#null,PluginEntryPoint#manual,PluginEntryPoint#standalone) 2016-03-14 01:33:03,782:DEBUG:letsencrypt.cli:Requested authenticator apache and installer apache 2016-03-14 01:33:03,786:DEBUG:letsencrypt.plugins.disco:No installation (PluginEntryPoint#apache): Traceback (most recent call last): File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/letsencrypt/plugins/disco.py", line 103, in prepare self._initialized.prepare() File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/letsencrypt_apache/configurator.py", line 152, in prepare raise errors.NoInstallationError NoInstallationError 2016-03-14 01:33:03,786:DEBUG:letsencrypt.display.ops:No candidate plugin 2016-03-14 01:33:03,786:DEBUG:letsencrypt.display.ops:No candidate plugin 2016-03-14 01:33:03,786:DEBUG:letsencrypt.cli:Selected authenticator None and installer None 2016-03-14 01:33:03,787:INFO:letsencrypt.cli:Could not choose appropriate plugin: The apache plugin is not working; there may be problems with your existing configuration. The error was: NoInstallationError() 2016-03-14 01:33:03,787:DEBUG:letsencrypt.cli:Exiting abnormally: Traceback (most recent call last): File "/root/.local/share/letsencrypt/bin/letsencrypt", line 11, in <module> sys.exit(main()) File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/letsencrypt/cli.py", line 1993, in main return config.func(config, plugins) File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/letsencrypt/cli.py", line 684, in obtain_cert installer, authenticator = choose_configurator_plugins(config, plugins, "certonly") File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/letsencrypt/cli.py", line 636, in choose_configurator_plugins diagnose_configurator_problem("authenticator", req_auth, plugins) File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/letsencrypt/cli.py", line 537, in diagnose_configurator_problem raise errors.PluginSelectionError(msg) PluginSelectionError: The apache plugin is not working; there may be problems with your existing configuration. The error was: NoInstallationError() |
Es gibt aber eine einfache Alternative, die auch als Cronjob funktioniert. Wir ändern unser Script zum Erneuern der Zertifikate wie folgt ab.
1 2 3 4 5 | $ cat /root/bin/letsencrypt-updatecerts.sh #!/bin/bash cd /root/letsencrypt ./letsencrypt-auto renew -c /etc/letsencrypt/cli.ini |
Damit funktioniert das Erneuern der Zertifikate auch aus dem Cronjob.
Es gibt momentan noch einen Schönheitsfehler. Da der Mailserver noch nicht konfiguriert ist, landen die Mails des cron jobs im lokalen Postfach für nobody. Das kann für den produktiven Betrieb so nicht bleiben. Da meine Domain, zu der unser Server gehört, auf einem Hostingvertrag ebenfalls bei 1&1 läuft und die E-Mails dort gehostet werden, ist die Lösung des Problems denkbar einfach. Wir müssen nur Postfix richtig für ausgehende Mail konfigurieren. Postfix ist als Mailserver vorkonfiguriert und läuft bereits. Zunächst setzen wir in der Datei /etc/postfix/main.cf den Eintrag für myhostname auf den tatsächlichen Hostnamen, dort steht momentan noch localhost. Ausserdem müssen wir den Hostnamen bei der Variable mydestination anfügen.
1 2 | myhostname = mysubdomain.mydomain.tld mydestination = localhost, localhost.localdomain, mysubdomain.mydomain.tld |
Anschließend restarten wir Postfix mit „service postfix restart“.
Jetzt müssen wir nur noch dafür sorgen, dass die Systemmails, die an den Benutzer „root“ geschickt werden, bei uns ankommen. Dazu ergänzen wir in der Datei /etc/aliases eine Weiterleitungszeile folgender Form.
1 | root: webmaster@whereever.de |
Bitte eine sinnvolle E-Mail-Adresse eintragen, damit die Mails bei Euch ankommen. Diese Änderung muss noch in die aliases Database übernommen werden. Dazu müssen wir das Kommando „newaliases“ ausführen, fertig. Jetzt können wir testen, ob ausgehende Mail funktioniert.
1 2 3 | mail -s Test root@localhost Das ist ein Test. Cc: |
Die Testmail sollte dann an der oben angegebenen E-Mail-Adresse ankommen.
Somit haben wir nun die Konfiguration eines Webservers mit Let’s Encrypt Zertifikaten abgeschlossen. Zum Abschluss machen wir noch einen Backup und nehmen dabei die Postfix Konfiguration ins Backup mit auf.
1 2 3 4 5 | $ cd /opt/1UND1EU/bin/ $ ./ClientTool control.selection.modify -datasource FileSystem -include /etc/postfix Backup selection successfully modified. $ ./ClientTool control.backup.start -datasource FileSystem Starting backup for FileSystem datasource. |
Im 5. Teil der Artikelserie werden wir uns ein wenig mit WordPress beschäftigen, denn ich möchte diesen Blog auf unseren Cloud Server umziehen.