HTTPS im localhost nutzen

HTTPS ist eine verschlüsselte Variante des HTTP ( Hypertext Transfer Protocols) und bedeutet, dass alle Daten zwischen dem Browser (Client) und dem Webserver verschlüsselt übertragen werden. Also eine sichere Verbindung. Zusätzlich wird überprüft, ob die Kommunikation zwischen Server und Client die richtige ist und sich kein anderer dazwischen gedrängelt hat. Dafür gibt es die Zertifkate.

Bei einem HTTPS Request vom Client an der Server sendet der Server sein Zertifkat gleich mit. Der Client und in diesem Fall der Browser checkt selbstständig in seiner Zertifkate Whitelist, ob das Zertifkate trusty ist. Genau genommen, wird überprüft, ob die Zertifzierungsstelle vertrauenswürdig ist. Falls dies nicht der Fall ist, kommt dann vom Browser eine Meldung wie diese:

Bei einer erfolgreichen Zertifkatsüberprüfung, wird ein temporärer Public Key an den Server zurückgeschickt. Mit dem Key werden die folgenden Datenströme der Sitzung verschlüsselt.

Schritt 1: Wir bauen ein eigenes OpenSSL Zertifikat

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/my-seotheater.key -out /etc/ssl/certs/my-seoetheater.crt

Jetzt musst Du einige Fragen beantworten, die für die Zertifikatsausstellung benötigt werden. Gleich gehe ich noch darauf ein.

Was bedeutet der opensssl Command im einzelnen?

openssl: Das startet das Programm OpenSSL über die Kommandozeile. Mit diesem Tool kannst du Zertifikate anlegen und bearbeiten. Es können mehrere Parameter mitgegeben werden. Folgende Parameter aus dem obigen Command nun im Detail:

  • req: Mit diesem Befehl gibt man an, dass man ein spezielles Zertifizierungsformat nutzen möchten. In unserem Fall den ITU-Standard X.509. Das man jetzt im folgenden gleich näher mit Parameter spezifiziert
  • x509: Das gewünschte Format welches man nutzen möchte zum erstellen des digitalen Zertifikats. x509 ist auch als ISO/IEC 9594-8 bekannt.
  • nodes: Dadurch wird OpenSSL angewiesen, unser Zertifikat nicht mit einem Passwort zu sichern und einfach zu überspringen. Wir brauchen das in unserem bestimmten Fall hier nicht. Ansonsten müssten wir jedes mal beim Serverneustart das Passwort für dieses Zertifikat eingeben.
  • -days 365: Mit -days setzt man die Dauer in Tagen des Zertifikats fest. In unserem Fall ein Jahr (365 Tage).
  • -newkey rsa:2048: Damit wird festgelegt, dass wir gleichzeitig ein neues Zertifikat und einen neuen Schlüssel generieren wollen. Ein sogenanntes Schlüsselpaar. Der Schlüssel ist zum signieren des Zertifikats erforderlich. Da wir diesen noch nicht nicht erstellt haben, machen wir das nun gleichzeitig. Mit rsa:2048 weist man an, mit RSA und 2048 Bit zu verschlüsseln.
  • -keyout: Damit wird OpenSSL mitgeteilt, wohin die erzeugte Datei mit dem privaten Schlüssel, hinterlegt werden soll.
  • -out: Damit weisen wir OpenSSL an, wo er das Zertifkat speichern soll.

Der obige Command mit diesen Optionen, erzeugt uns einen Schlüssel und das dazugehörige Zertifkat. Es werden uns einige Fragen zu unserem Server gestellt. Die Antworten werden in das Zertifikat hinterlegt.

Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:Olsberg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:SeoTheater.de
Organizational Unit Name (eg, section) []:SeoTheater.de
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:admin@deine_domain.de

Beiden Dateien (Schlüssel und Zertifikat) werden in den entsprechenden Unterverzeichnissen unter /etc/ssl abgelegt.

2. Schritt: Apache zur SSL Nutzung konfigurieren

Wir werden einige Anpassungen an unserer Konfiguration vornehmen:

  1. Wir werden ein Konfigurations-Snippet erstellen, um die Standard-SSL-Einstellungen festzulegen.
  2. Wir werden die standard SSL-Apache-Virtual-Host-Datei so modifizieren, dass sie auf unser neues selbstgenerierten SSL-Zertifikate verweist.
  3. (Optinal) Wir werden die den virtuellen Hosts so modifizieren, dass die Anfragen automatisch an den verschlüsselten virtuellen Host umgeleitet werden.

Wenn wir damit fertig sind, sollten wir eine gute SSL-Konfiguration haben.

Erstellen der Apache-Konfiguration

Zuerst werden wir ein Apache-Konfiguration erstellen, um einige SSL-Einstellungen zu definieren. Das wird dazu beitragen, unseren Server sicherer zu machen. Die Parameter, die wir einstellen werden, können übrigens von allen virtuellen Hosts verwendet werden, die SSL aktivieren.

Wir erstellen eine Datei im Verzeichnis /etc/apache2/conf-available. Diese Datei bennen wir ssl-params.conf. Der Name sagt ja schon was hier Programm ist.

sudo nano /etc/apache2/conf-available/ssl-params.conf

und kopieren folgenden Snippet rein:

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

und speichern.

Die Apache SSL Virtual Host Datei anpassen

Als nächstes modifizieren wir die Standard SSL Konfiguration ( /etc/apache2/sites-available/default-ssl.conf ). Bevor wir das tun, kopieren wir die Original Datei zur Sicherheit.

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.backup

Jetzt gehen wir in die default-ssl-conf mit:

sudo nano /etc/apache2/sites-available/default-ssl.conf

rein. Der Inhalt sollte in etwas so ausschauen:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

Wir ändern es wie folgt ab:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin MEINE@EMAIL.com
                ServerName MEINEDOMAIN.DE

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/MEIN_CERT_NAME.crt
                SSLCertificateKeyFile /etc/ssl/private/MEIN_KEY_NAME.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

(Optional) Die HTTP Host File anpassen – Redirect auf HTTPS

Dieser Schritt ist zwar optional aber man sollte diesen aus Sicherheitsgründen nicht überspringen. Mit der aktuellen Einstellung wird der Server eine verschlüsselte und eine unverschlüsselte Verbindung zur Verfügung stellen. Wenn es ein Production Server ist, dann wäre es sehr sinnvoll alle Anfragen automatisch auf HTTPS weiterzuleiten. Falls es wie in unserem Beispiel nur für localhost gelten soll, dann kannst Du diesen Abschmitt getrost übersrpingen.

Dazu gehen wir in die Datei /etc/apache2/sites-available/000-default.conf .

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

Innerhalb des VirtualHost Konfigurationsblocks, fügen wir die Weiterleitungs-Direktive hinzu, die den gesamten Traffic auf die SSL Version der Seite weiterleitet.

<VirtualHost *:80>
        . . .

        Redirect "/" "https://deine-domnain-oder-ip/"

        . . .
</VirtualHost>

Und speichern.

Schitt 3 – Die Firewall einstellen

Wenn Du ufw-Firewall aktiviert hast, musst Du gegenbenfalls bei den Einstellung etwas anpassen um den SSL Traffic durchzulassen. Apache registriert bei der Installation bereits einige Profile bei der Firwall.

sudo ufw app list
Available applications:
  Apache
  Apache Full
  Apache Secure
  CUPS
  OpenSSH

Ob Deine Firwall aktiv ist, checkst Du mit:

sudo ufw status

Jetzt kannst Du mit den zwei Commands die Firwall anpassung vornehmen:

sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'

Schritt 4 – Mach die Änderungen jetzt aktiv

Nun, da wir unsere Änderungen vorgenommen und unsere Firewall angepasst haben, können wir das Apache SSL-Module aktivieren und den Server neustarten.

Die benötigten Module (mod_ssl, mod_headers) aktivieren wir mit:

sudo a2enmod ssl
sudo a2enmod headers

Als nächstes machen wir den SSL Virtual Host mit a2ensite verfügbar.

sudo a2ensite default-ssl.conf

Dann müssen wir noch unsere ssl-params.conf Datei mit verfügbar machen.

sudo a2enconf ssl-params

Ab diesem Moment sind alle benötigten Module verfügbar. An dieser Stelle empfiehlt sich noch ein Konfiguartions-Syntax check durchzuführen. Das geht ganz einfach mit:

sudo apache2ctl configtest

Wenn keine Syntaxfehler gefunden wurden, erhälst Du in etwa diese Meldung hier:

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

Wir sind nun soweit. Wir starten zum Schluss noch den Server neu mit:

sudo systemctl restart apache2

Schritt 5 – HTTPS Testing

Öffne ein Browserfenster und gebe Deine locale Testdomain ein. In meinem Fall wäre es https://localhost

Weil unser selbsterstellte Zertifkat nicht vertrauensvoll ist, erhalten wir folgenden Warnhinweis des Brwosers. Das ist an dieser Stelle total harmlos und auch richtig. Wir klicken auf Erweitert und füge für diesen Fall eine Ausnahmegenehmigung hinzu.


Leave a Comment

Your email address will not be published. Required fields are marked *

*

*

Empfholende Artikel


SVG zu PNG konvertieren

March 20, 2021

Als Webentwickler kommt man um das SVG Format nicht mehr herum. Und das ist auch gut so! Das Thema SVG in der Webentwicklung ist vielseitig und umfänglich. Es fängt an, wie man SVG Grafiken am elegantesten in sein Projekt einbindet und endet wie man sein Webpack diesbezüglich konfiguriert. Wenn man überhaupt mit Webpack arbeitet und […]

Ubuntu VLC Player DVD spielt nicht ab

March 14, 2021

Man hat sich eine DVD Bestellt. In meinem Fall war es Fargo. Nicht die Serie sondern der Originalfilm aus dem Jahr 1996. Für alle die den Film nicht kennen: „Es lohnt sich“. Jedenfalls wollte ich den Film über Laptop schauen. Ich leg die Scheibe ein und öffne den VLC Player. Menüpunkt Media → Open Disc […]

Ubuntu – Find – Mit der Konsole Dateien finden

March 5, 2021

Ein häufiges Problem ist, dass man Dateien, die man irgendwo abgelegt hatte, nicht finden kann. Man kann natürlich über die Linux Dist UI die Dateien in Files / Dateieinmanager suchen. Aber warum sollte man nicht das Kommandozeilen-Terminal dazu nutzen? Insbesondere wenn Du über SSH auf dem Server eingeloggt bist, geht es ja nur mit Konsole. […]

Ubuntu – Firefox Sessions Backup

February 7, 2021

Wenn irgendwann mal das Internet für längere Zeit ausfallen sollte – Stichwort Cloudausfall – wäre ich gewappnet. Ich habe das Internet bei Firefox in meinen Tabs offen. Vielleicht gehört ihr auch zu denen, die über 1000 Tabs offen haben. Warum auch immer. Wahrscheinlich könnte man darüber eine Doktorarbeit schreiben. Mit dem Titel: „Persönlichkeitsanalyse anhand des […]

Bash Script – kurz mal erklärt

February 2, 2021

Heute mal eine einfache Sache, falls man sie Klever einsetzt, eine Menge Arbeit abnehmen kann. Die Rede ist vom guten alten Shell-Script. Wer ständig die gleichen Befehle absetzen muss, der kann sich doch automatisieren. Ich zum Beispiel nutze Shell Script für das Deployment Prozess. Also den fertigen Code von der Entwicklungsumgebung in die Produktionsumgebung zu […]

MySQL Datenbankserver im lokalen Netzwerk einrichten

November 19, 2020

Es kommt mal vor, dass man beim Entwickeln die Test, Entwickler Datenbank nicht auf einem Liveserver sowie auf dem lokalen Rechner einrichten möchte. Und arbeiten an der Livedatenbank sollten sowieso keine Option sein. Jedenfalls kann der Wunsch nach einer Testdatenbank, die nicht auf dem Entwicklerrechner installiert ist unterschiedliche Gründe haben. Ein häufiger Grund ist wohl, […]