Apache2 mit Let’s Encrypt SSL-Zertifikat und ReverseProxy installieren

Schlagwörter:

Wir installieren auf zwei Raspberry Pi Computern jeweils einen Apache WebServer. Der erste, vordere WebServer ist über eine Freigabe im Router aus dem Internet erreichbar und leitet Anfragen mittels ReverseProxy an den zweiten, hinteren Apache WebServer weiter. Der vordere WebServer wird mittels kostenlosem SSL-Zertifikat von „Let’s Encrypt“ abgesichert, so dass die Daten verschlüsselt über das Internet übertragen werden.

Vorbedingungen:

Vorderen Apache WebServer installieren

~ $ sudo apt-get update
~ $ sudo apt-get upgrade

~ $ sudo apt-get install apache2

~ $ ifconfig |grep "inet "|grep -v "127.0.0.1"
    inet 192.168.0.101  netmask 255.255.255.0  broadcast 192.168.0.255

ifconfig ermittelt die lokale IP-Adresse des Computers. Über die IP-Adresse kann man nun bereits von einem anderen Computer aus dem lokalen Netzwerk auf den WebServer zugreifen.

Im Internet-Browser beispielsweise http://192.168.0.101 eingeben.

Die IP-Adresse wird vom DNS-Server im lokalen Netz vergeben und variiert. Es kann sein, dass die IP-Adresse Tage später tatsächlich anders ist. In meiner Fritz-Box habe ich den DNS-Server so angepasst, dass er immer die gleiche IP-Adresse vergibt. http://fritz.box > Heimnetz > Netzwerk > „Hostname“ > Bearbeiten > Haken bei „Diesem Netzwerk immer die gleiche IPv4-Adresse zuweisen“. Die voreingestellte Adresse nicht verändern.

Hinteren Apache WebServer installieren

Viele Webanwendungen benötigen einen WebServer, der PHP ausführt. Aus Sicherheitsgründen sollte man zwei WebServer auf verschiedenen Computern installieren. Auf dem ersten WebServer wird dann ein Reverse-Proxy eingerichtet, der auf den 2. WebServer zugreift. Der 1. WebServer wird ohne PHP und der 2. inklusive PHP installiert.

Weiterer Vorteil ist es, dass die Webanwendungen nicht alle auf dem gleichen Computer sein müssen. Der 1. WebServer fasst die Webanwendungen der verschiedenen Computer zusammen, so dass alle über einen Port (443) zu erreichen sind. Es sieht so aus, als wären alle Webanwendungen auf dem vorderen WebServer, obwohl sie eigentlich von den dahinter liegenden WebServern abgerufen werden, die als solche von außerhalb jedoch nicht zu erkennen sind. Zudem muss nur ein SSL-Zertifikat für den 1. WebServer und nicht für alle Computer erstellt werden.

~ $ sudo apt-get update
~ $ sudo apt-get upgrade

~ $ sudo apt-get install apache2 php php-mysql libapache2-mod-php php-xml php-mbstring

~ $ ifconfig |grep "inet "|grep -v "127.0.0.1"
    inet 192.168.0.102 netmask 255.255.255.0 broadcast 192.168.0.255

Der 2. Apache braucht ebenfalls im lokalen Netz eine feste Adresse.

Für erste Experimente reicht es, nur den 2. Apache-WebServer inkl. PHP zu installieren. Später sollte dann der 1. WebServer mit dem Let’s Encrypt SSL-Zertifikat und ReverseProxy davor geschaltet werden.

Vorderen Apache WebServer von außen erreichbar machen

Der vordere WebServer soll nicht nur aus dem lokalen Netz, sondern auch über das Internet von außen erreichbar sein. Am Beispiel meiner Fritz-Box geht das wie folgt.

http://fritz.box > Internet > Freigaben > „Hostname“ > bearbeiten: Dort zwei Freigaben eintragen (Port 80 und Port 443). Der 80er Port kann entfallen, ist für Tests aber hilfreich. Zudem könnte man eine Weiterleitung vom unverschlüsselten Port 80 (http) auf den verschlüsselten Port 443 (https) einrichten.

Die IP-Adresse, über den die Fritz-Box aus dem Internet erreichbar ist, finden wir unter: http://fritz.box > Internet > Online-Monitor > „Internet, IPv4“,

Nun sollte der vordere WebServer über die Eingabe der IP-Adresse im Browser erreichbar sein.

Domain

SSL-Zertifikate können nicht für IP-Adressen ausgestellt werden. Wir benötigen eine eigene Domain. So eine Domain ist für kleines Geld verfügbar und kann über einen Anbieter wie Strato oder einem lokalen Internet-Provider wie Netcologne beantragt werden. Idealerweise hast du noch eine feste IP-Adresse, denn dynamische eignen sich nur bedingt. Sollte sich die IP-Adresse ändern, was je nach Anbieter sogar mehrmals täglich der Fall sein kann, dauert es ggf. länger, bis die DNS-Server im Internet die neue Adresse verteilt haben und nicht mehr die vorherige, alte ausliefern. Das führt zu unschönen Unterbrechungen, während dessen unser WebServer dann nicht erreichbar wäre.

In der Konfigurations-Oberfläche des Anbieters muss die Domain so konfiguriert werden, dass die feste IP-Adresse hinterlegt ist. Wenn man dann aus dem Internet im Browser den Domain-Namen eingibt, so ermittelt er dann über einen DNS-Server diese IP-Adresse und gelangt auf unseren eigenen WebServer.

Bei Strato trägt man beim A-Record die IP-Adresse des Internetanschlusses ein. Es kann eine Weile dauern, bis die geänderte IP-Adresse aufgelöst wird.

~ $ nslookup <domainname>

Let’s Encrypt Zertifikat

Die Let’s Encrypt Zertifikate sind kostenlos. Damit dem Anbieter keine unnötigen Kosten entstehen, ist die Beantragung automatisiert. Zudem sind die Zertifikate nur wenige Monate gültig, was jedoch kein Problem ist, weil wir automatisch und rechtzeitig neue bekommen. Es muss auf unserem vorderen Rasberry Pi ein Certbot installiert werden, der diese Aufgabe übernimmt.

Certbot installieren

~ $ sudo apt-get update
~ $ sudo apt-get install git
~ $ git clone https://github.com/letsencrypt/letsencrypt
~ $ cd letsencrypt
~/letsencrypt $ ./letsencrypt-auto --verbose --apache -d <domainname>

Automatische Erneuerung einrichten

Zuerst rufen wir als Test den Certbot manuell auf

~/letsencrypt $ ./letsencrypt-auto renew --dry-run

dry-run verändert nichts.

Nun den echten Aufruf mit vollem Pfad manuell ausprobieren

~ $ sudo /home/pi/letsencrypt/letsencrypt-auto renew

Der Befehl prüft, ob ein neues Zertifikat ausgestellt werden muss und führt das dann durch. Normalerweise ist das nicht nötig. Es wird dann einfach nichts gemacht. Wir können den Befehl daher häufiger aufrufen.

Dazu erstellen wir einen Eintrag in Crontab, der den Befehl regelmäßig ausführen wird.

~ $ sudo crontab -e

Folgende Zeile einfügen.

1 0  *   *   2   /home/mst/letsencrypt/letsencrypt-auto renew

Ggf. den Apache nochmal neu starten mit

~ $ sudo service apache2 restart

Jetzt kann der vordere WebServer mit SSL (HTTPS) aufgerufen werden.

ReverseProxy

Das Apache-Modul wird wie folgt nachinstalliert und konfiguriert:

~ $ sudo apt-get install libapache2-mod-proxy-html

~ $ sudo a2enmod proxy_http

~ $ sudo vi /etc/apache2/sites-enabled/default-ssl
~ $ sudo service apache2 restart

In die Datei default-ssl beispielsweise folgendes eintragen:

...
<VirtualHost _default_:443>

        ...

        ProxyPreserveHost On
        ProxyRequests off
        ProxyPass /xyz http://192.168.0.102:80/xyz
        ProxyPassReverse /xyz/ http://192.168.0.102:80/xyz
</VirtualHost>
...

Zum Test auf dem hinteren WebServer eine Datei hinterlegen

~ $ cd /var/www/html/
/var/www/html $ sudo mkdir xyz
/var/www/html $ sudo vi xyz/test.txt

und mit https://<domainname>/xyz/test.txt aufrufen. Der Inhalt der test.txt wird dann angezeigt.

Alle URLs, die mit https://<domainname>/xyz anfangen, werden an den hinteren Apache weitergeleitet. Es können weitere Einträge erfolgen. Dafür müssen jeweils die zwei Zeilen mit ProxyPass und ProxyPassReverse wiederholt und angepasst werden.

Weiterführende Links

 

Schreibe einen Kommentar