HTTPS unter Apache/Ubuntu

Dieser Artikel zeigt Euch, wie man eine eigene Webseite unter Ubuntu Server 18.04 LTS mit Hilfe des Apache Web-Servers und Let’s Encrypt einfach und kostenlos mit HTTPS absichern kann.

Diskussion

Transport Layer Security (kurz TLS) ist ein Verschlüsselungsverfahren zum sicheren Übertragen von Daten über öffentliche Netzwerke. Bekannter ist es immer noch unter dem alten Namen SSL (Secure Sockets Layer). TLS ist die Grundlage für das Übertragungsprotokoll HTTPS, einer Erweiterung des HTTP-Protokolls, das die Übertragung von Daten verschlüsselt.

Wenn Du in Deinem Web-Browser eine Webseite aufrufst, dann wird sie dir entweder per HTTPS oder aber HTTP übermittelt. Du erkennst das am Präfix der URL. Lautet dieser http://, dann ist es eine HTTP-Verbindung, lautet er https://, dann ist es eine HTTPS-Verbindung.

Da HTTP-Verbindungen in allen modernen Web-Browsern mittlerweile als potentiell unsicher gekennzeichnet werden, gibt es kaum noch öffentliche Webseiten ohne HTTPS. Aber warum ist das so?

  1. HTTPS verschlüsselt den Datenverkehr zwischen dem Web-Browser des Anwenders und deiner Webseite. Niemand außer euch beiden kann also sehen, welche Daten ihr untereinander austauscht. Und was fast noch wichtiger ist, niemand kann diese Daten ändern. Der letzte Aspekt wird leider viel zu oft unterschätzt. Das Argument, dass die eigene Website nur statischen Inhalt anzeigt und keine Benutzerdaten erfragt, geht hier ins Leere. Stell dir vor, jemand fängt alle Anfragen für Deine Webseite ab und lenkt sie stattdessen auf eine andere Webseite mit kriminellem Inhalten um. Das ist nicht schön, mit HTTPS kannst Du dies zuverlässig unterbinden.

  2. Die Datenschutzgrundverordnung (DSGVO) verpflichtet Webseiten-Betreiber, das eigene Angebot nach dem aktuellen Stand der Technik zu schützen (siehe Art. 32 DSGVO Sicherheit der Verarbeitung). HTTPS als ein Baustein in der Sicherheitsarchitektur kann ohne Zweifel als aktueller Stand der Technik betrachtet werden.

  3. Die Unterstützung von HTTP/2 setzt in der Regel den Einsatz von TLS voraus.

  4. Die Google-Suche bewertet Webseiten mit HTTPS tendenziell höher als Webseiten ohne HTTPS. Das hat natürlich Auswirkung auf das Suchergebnis unter Google.

Wen das nicht überzeugt, dem sei die Webseite https://doesmysiteneedhttps.com ans Herz gelegt.

Die Nutzung von HTTPS für die eigene Webseite muss nichts kosten und kann mit sehr geringem Aufwand implementiert werden. Im weiteren Verlauf dieses Blog-Artikels zeige ich euch, wie einfach das gehen kann.

Let’s Encrypt

Die Grundlage von HTTPS sind TLS-Zertifikate, die von einer vertrauenswürdigen Zertifizierungsstelle ausgegeben werden. Let’s Encrypt (zu deutsch: Lasst uns verschlüsseln) ist eine Zertifizierungsstelle, die kostenlose TLS-Zertifikate anbietet. Diese sind nur drei Monate gültig und werden durch Automation regelmäßig erneuert. Hauptsponsoren dieses Projekts sind unter anderem die Electronic Frontier Foundation (EFF), die Mozilla Foundation, Facebook, Google Chrome und Cisco Systems.

Grundlage für die automatische Bereitstellung und Aktualisierung von Zertifikaten durch Let’s Encrypt ist das sogenannte ACME-Protokoll (Automatic Certificate Management Environment Protocol), ein standardisiertes Internetprotokoll, das unter anderem prüft, ob der Anfragende auch wirklich die Kontrolle über eine Domäne hat.

Als Betreiber einer oder mehrerer Webseiten benötigt man lediglich einen ACME-kompatiblen Client und schon kann man bei Let’s Encrypt neue TLS-Zertifikate erfragen, und das kostenlos. Klingt gut, oder?

Los geht’s

Wir werden jetzt folgendes tun:

  1. Apache unter Ubuntu Server 18.04 LTS installieren und so konfigurieren, dass eine Webseite unter http://www.beispiel.de abrufbar ist.

  2. Den ACME-Client Certbot installieren und Apache so konfigurieren, dass unsere Webseite auch unter https://www.beispiel.de abrufbar ist.

  3. Die Apache-Konfiguration weiter absichern, indem wir veraltete Protokolle und kryptografische Verfahren deaktivieren.

Apache installieren

Der Apache Web-Server ist ein Open Source-Projekt der Apache Software Foundation und unter der Apache License lizenziert. Das Projekt ist schon mehr als 25 Jahre alt und in so ziemlich jeder Linux-Distribution standardmäßg enthalten.

Eine Installation unter Ubuntu geht wie folgt:

$ sudo apt-get update
$ sudo apt install apache2

Der erste Befehl aktualisiert die Packetlisten auf unserem Ubuntu-Server, der zweite Befehl installiert Apache mit all seinen Abhängigkeiten und startet den Web-Serverdienst.

Als nächstes musst Du das Apache-Modul mod_headers installieren. Dies wird benötigt, um HTTP-Kopfdaten manipulieren zu können.

$ sudo a2enmod headers

Apache installiert eine Standard-Webseite, die auf alle HTTP-Anfragen reagiert.

Überprüfe dies zunächst lokal:

$ wget -S --spider localhost

Läuft Apache, dann bekommst Du eine Meldung wie diese hier:

Spider-Modus eingeschaltet. Es wird geprüft, ob die Datei auf dem Server existiert.
--2021-02-23 12:52:04--  http://localhost/
Auflösen des Hostnamens localhost (localhost) … ::1, 127.0.0.1
Verbindungsaufbau zu localhost (localhost)|::1|:80 … verbunden.
HTTP-Anforderung gesendet, auf Antwort wird gewartet …
  HTTP/1.1 200 OK
  Date: Thu, 23 Feb 2021 11:52:04 GMT
  Server: Apache/2.4.29 (Ubuntu)
  Last-Modified: Wed, 14 Oct 2020 19:28:31 GMT
  ETag: "2aa6-5b1a68961ed53"
  Accept-Ranges: bytes
  Content-Length: 10918
  Vary: Accept-Encoding
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Content-Type: text/html
Länge: 10918 (11K) [text/html]
Datei auf dem Server existiert und könnte weitere Verweise enthalten,
aber Rekursion ist abgeschaltet -- kein Download.

Für einen externen Test öffne die URL http://www.beispiel.de in Deinen Web-Browser. Das Ergebnis sollte wie folgt aussehen:

Apache Standard-Webseite

Apache Standard-Webseite

Eine neue Webseite anlegen

Schauen wir uns zunächst die Installation von Apache genauer an:

  • Alle Konfigurationsdateien liegen standardmäßig unter etc/apache2/.

  • Die Standardkonfigurationsdatei lautet /etc/apache2/apache2.conf.

  • Für jede neue Webseite legt man im Unterverzeichnis /etc/apache2/sites-available/ eine neue Konfigurationsdatei anlegen. Diese werden automatisch in die Standardkonfiguration eingebettet.

  • Die Konfiguration der Standard-Webseite aus dem vorherigen Abschnitt ist in der Datei /etc/apache2/sites-available/000-default.conf gespeichert.

Wir wollen jetzt die Standard-Webseite mit der festen Bindung http://www.beispiel.de konfigurieren. Mit der vorgegebenen Catch-All-Konfiguration können wir nicht auf https umstellen.

Öffne dazu die Konfigurationsdatei der Standard-Webseite im Texteditor Nano (Du kannst natürlich auch einen anderen Texteditor nutzen).

$ sudo nano /etc/apache2/sites-available/000-default.conf

Der entscheidende Eintrag ist die folgende auskommentierte Zeile:

<VirtualHost *:80>

	. . . 
	
	#ServerName www.example.com

	. . . 

</VirtualHost>

Diese ändern wir ab in:

<VirtualHost *:80>

	. . . 
	
	ServerName www.beispiel.de

	. . . 

</VirtualHost>

Das Ergebnis speichern wir und starten Apache neu:

$ sudo systemctl restart apache2

Ein erneuter Test mit http://www.beispiel.de in Deinen Web-Browser sollte noch immer die Standardausgabe von Apache zeigen.

Certbot installieren

Damit diese Webseite auch unter https://www.beispiel.de erreichbar ist, benötigen wir noch ein weiteres Werkzeug namens Certbot. Certbot ist ein Open Source Werkzeug zum automatisierten Erzeugen von TLS-Zertifikaten durch Let’s Encrypt.

Eine Installation unter Ubuntu geht wie folgt:

$ sudo apt install certbot python3-certbot-apache

Und dann kann es auch schon losgehen. Mit dem folgenden Befehl können wir das HTTPS-Protokoll für unsere Beispielseite aktivieren:

$ sudo certbot --apache

Beim aller ersten Einsatz von Certbot musst Du zunächst ein paar Fragen beantworten. Certbot fragt Dich nach Deiner E-Mail-Adresse zur Registrierung bei Let’s Encrypt. Bei Problemen (z.B. bei nicht durchgeführter Erneuerung eines Zertifikats) oder Missbrauch wirst Du automatisch von Let’s Encrypt per E-Mail benachrichtigt.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

Anschließend möchte Certbot, dass Du Dir die Nutzungsbedingungen (Terms of Service) von Let’s Encrypt durchliest und diesen zustimmst.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel:

Die nächste Frage kann man getrost mit No beantworten.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n

Und jetzt kommt der interessante Teil. Certbot listet nun alle Webseiten unter Apache auf und Du musst entscheiden, bei welchen Du HTTPS aktivieren möchtest. In unserem Beispiel wird nur eine Webseite angezeigt, nämlich unsere zuvor eingerichtete Seite www.beispiel.de:

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: www.beispiel.de
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

Bestätige mit der Eingabetaste und Certbot beginnt damit, ein neues TLS-Zertifikat von Let’s Encrypt zu erfragen. Das sieht dann in etwa so aus.

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www.beispiel.de
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Während des Konfigurationsvorgangs wirst Du gefragt, ob Du eine automatische Umleitung von http auf https einrichten möchtest. In der Regel kann man hier mit 2 antworten.

Die Konfiguration schließt mit folgenden Meldungen ab:

Enabled Apache rewrite module
Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://www.beispiel.de

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=www.beispiel.de
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.beispiel.de/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.beispiel.de/privkey.pem
   Your cert will expire on 2021-01-14. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Certbot hat folgendes gemacht:

  • Eine neue Datei /etc/letsencrypt/options-ssl-apache.conf angelegt, in der globale TLS-Einstellungen für potentiell alle Webseiten hinterlegt sind.

  • Eine neue Datei /etc/apache2/sites-available/000-default-le-ssl.conf angelegt, in der die TLS-Konfiguration für unsere Beispielseite hinterlegt ist. In dieser Datei sind auch Verweise auf die TLS-Zertifikate sowie ein Verweis auf die globale TLS-Einstellungen definiert.

  • Einen CronJob unter /etc/cron.d/certbot eingerichtet, der zweimal am Tag die TLS-Zertifikate überprüft. Liegt das Ablaufdatum für ein TLS-Zertifikat weniger als 30 Tage in der Zukunft, wird es automatisch erneuert.

Ein erster Test mit https://www.beispiel.de in Deinem Web-Browser sollte die gewohnte Standard-Webseite von Apache anzeigen. Ein zweiter Test mit http://www.beispiel.de sollte erfolgreich auf https://www.beispiel.de umleiten.

TLS absichern

Wer sich die Ausgabe von Certbot genau anschaut, entdeckt die folgende Infozeile:

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=www.beispiel.de

Und genau das machen wir jetzt auch. SSL Labs ist eine Webseite, welche die TLS-Konfiguration für eine beliebige öffentliche Webseite überprüfen kann.

Für unsere Beispielseite www.beispiel.de gibt SSL Labs folgendes Ergebnis aus:

Apache frisch installiert

Apache frisch installiert

Das sieht natürlich nicht so prickelnd aus. Die Probleme hier sind:

  1. Uralte TLS-Versionen 1.0 und 1.1. Diese sollten dringend deaktiviert werden.

  2. Zahlreiche veraltete kryptographische Verfahren, die von SSL Lab als unsicher (weak) markiert werden.

Wir müssen also nocheinmal ran an die Apache-Konfiguration, um unseren Web-Server besser zu schützen.

$ sudo nano /etc/letsencrypt/options-ssl-apache.conf

Damit öffnen wir die globale TLS-Konfigurationsdatei. Die Frage ist nun, was genau müssen wir denn jetzt ändern? Hier kann uns das Mozilla-Projekt helfen. Unter der folgenden Webseite

https://ssl-config.mozilla.org/

findest Du einen SSL Configuration Generator für Apache (und andere Web-Server).

Wir wählen für unser Beispiel die Konfiguration Apacheund Intermediate aus und kopieren die relevanten Teile der generierten Konfiguration in unsere bereits geöffnete Konfigurationsdatei. Das sieht dann so aus:

SSLEngine on

# enable HTTP/2, if available
Protocols h2 http/1.1

# HTTP Strict Transport Security (mod_headers is required) (63072000 seconds)
Header always set Strict-Transport-Security "max-age=63072000"
	
# intermediate configuration
SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite			ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder     on
SSLSessionTickets       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"

Speichere die Datei options-ssl-apache.conf und starte Apache neu:

$ sudo systemctl restart apache2

Ein abschließender Test unter SSL Labs ergibt nun folgendes Bild:

Apache abgesichert

Apache abgesichert

Auch die zusammenfassende Bewertung von SSL Lab sieht jetzt richtig gut aus:

Ein A+ Rating für unsere Webseite

Ein A+ Rating für unsere Webseite

HTTP/2

Die Konfiguration von HTTPS unter Apache hat noch einen weiteren angenehmen Nebeneffekt. Apache unterstützt in diesem Fall das HTTP/2-Protokoll. Alle modernen Web-Browser haben diesen Protokollstandard bereits implementiert und können daher ab sofort per HTTP/2 mit deiner Webseite kommunizieren. Allerdings muss dazu die Apache-Installation erneut angepasst werden.

Installiere das Apache-Modul mod_http2:

$ sudo a2enmod http2

Starte Apache neu:

$ sudo systemctl restart apache2

Voilà. Dein Apache sollte jetzt auch auf http/2-Anfragen antworten.

Troubleshooting

Sollte Apache bei aktiver http/2-Konfiguration nicht antworten, hilft ein Blick in das Fehler-Log:

$ sudo nano /var/log/apache2/error.log

Finden sich dort Einträge wie diese hier

Resource temporarily unavailable: AH03104: apr_thread_create: unable to create worker thread

dann hast Du wahrscheinlich Probleme mit Ressourcen-Limits auf Deinem Ubuntu-System. Die Kennzahl hier ist die maximal erlaubte Anzahl von Prozessen (Option TasksMax) für eine Prozessgruppe wie Apache. Den aktuellen Wert erhältst Du durch folgenden Aufruf:

$ systemctl show apache2.service | grep TasksMax

Unter Ubuntu beträgt dieser Wert standardmäßig 15% der Maximalanzahl aktiver Prozesse im System. Kostengünstige virtuelle Linux-Server in der Cloud haben oft einen sehr kleinen Wert (60 ist bisher der kleinste, der mir begegnet ist).

Du kannst den Wert erhöhen (z.B. auf 1024):

$ sudo systemctl set-property apache2.service TasksMax=1024

Oder Du kannst die Grenze ganz aufheben:

$ sudo systemctl set-property apache2.service TasksMax=infinity

Artikelhistorie

  • 04.01.2021
    • Erstveröffentlichung
  • 24.02.2021
    • Refactoring von Teilen des Artikels
Das könnte dich auch interessieren:
  1. Ubuntu Server 18.04 installieren
  2. HTTPS unter IIS 10
  3. TLS unter IIS 10 absichern
Teile diesen Artikel
comments powered by Disqus