Lose Blätter - Software

Anleitung: Sichere Absicherung eines Web-Verzeichnisses mittels mTLS (Client-Zertifikate) unter Apache2

Diese Dokumentation beschreibt die Einrichtung einer gegenseitigen TLS-Authentifizierung (mTLS), um ein Web-Verzeichnis (z. B. für ein PHP-Dateimanagement-Skript) auf Netzwerkebene abzusichern. Der Zugriff ist nur für Geräte möglich, auf denen das passende Client-Zertifikat installiert ist.

1. Übersicht der Architektur

Anstatt den Zugriff über komplexe IP-Routing-Regeln (VPN/Tunnel) zu beschränken, prüft der Apache-Webserver bereits beim TLS-Handshake das kryptografische Zertifikat des Browsers. Ohne gültiges Zertifikat wird die Verbindung sofort abgebrochen, noch bevor PHP-Code ausgeführt wird.

2. Erstellung der Zertifizierungsstelle (CA) und des Client-Zertifikats

Führe die folgenden Befehle auf dem Server (oder einem Linux-System) mittels openssl aus.

Schritt A: Eigene CA (Zertifizierungsstelle) erstellen

Die CA dient als dein "digitaler Stempel", um vertrauenswürdige Client-Zertifikate zu signieren.

# 1. Privaten Schlüssel für die CA generieren (streng geheim halten!)
openssl genrsa -out myCA.key 2048

# 2. CA-Zertifikat erstellen (10 Jahre gültig)
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 3650 -out myCA.pem

Schritt B: Client-Zertifikat generieren und signieren

Das ist der digitale "Ausweis" für deine Endgeräte.

# 1. Privaten Schlüssel für den Client generieren
openssl genrsa -out client.key 2048

# 2. Zertifikatsanfrage (CSR) erstellen
openssl req -new -key client.key -out client.csr

# 3. Das Client-Zertifikat mit deiner eigenen CA signieren (10 Jahre gültig)
openssl x509 -req -in client.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out client.pem -days 3650 -sha256

Schritt C: Zertifikat für den Browser verpacken (.p12)

Browser benötigen ein gebündeltes Format (PKCS#12), das den Schlüssel und das Zertifikat vereint.

openssl pkcs12 -export -out client.p12 -inkey client.key -in client.pem -certfile myCA.pem

Wichtig: Vergebe hierbei ein starkes Export-Passwort.

3. Konfiguration des Apache2 VirtualHosts

Da moderne Browser bei TLS 1.3 eine nachträgliche Abfrage (Post-Handshake Authentication) innerhalb eines Unterverzeichnisses blockieren, wird der Schutz für den gesamten VHost der Subdomain aktiviert.

  1. Kopiere die myCA.pem auf dem Server nach /etc/apache2/ssl/myCA.pem.
  2. Passe deine VHost-Konfiguration (Port 443) an:
<VirtualHost *:443>
   ServerName manage.j62.de
   DocumentRoot "/var/www/manage"

   SSLEngine On
   # Reguläre SSL-Zertifikate (z. B. dein Wildcard-Import)
   SSLCertificateFile /var/live/j62.de/fullchain.pem
   SSLCertificateKeyFile /var/live/j62.de/privkey.pem

   Include conf-available/ssl-security-standards.conf

   # mTLS "Türsteher"-Konfiguration
   SSLCACertificateFile /etc/apache2/ssl/myCA.pem
   SSLVerifyClient require
   SSLVerifyDepth 1

   <Directory "/var/www/manage">
        # Verhindert das Überschreiben der Sicherheitsregeln durch .htaccess
        AllowOverride None
        SSLOptions +StdEnvVars
    </Directory>
</VirtualHost>

# Permanente Weiterleitung von HTTP zu HTTPS
<VirtualHost *:80>
   ServerName manage.j62.de
   Redirect permanent / https://manage.j62.de/
</VirtualHost>
  1. Konfiguration testen und Apache neu starten:
sudo apachectl -t
sudo systemctl restart apache2

4. Einrichtung auf den Endgeräten

Übertrage die Datei client.p12 sicher auf deine Geräte.

Windows 11 (für Chrome, Edge, etc.)

  1. Drücke Win + R, tippe certmgr.msc ein und drücke Enter (Windows-Zertifikatsmanager).
  2. Navigiere links zu Eigene Zertifikate -> Zertifikate.
  3. Rechtsklick im rechten, leeren Feld -> Alle Aufgaben -> Importieren...
  4. Wähle die client.p12 aus (Filter ggf. auf "Alle Dateien" stellen).
  5. Gib das Export-Passwort ein.
  6. Stelle sicher, dass als Speicherort explizit Eigene Zertifikate ausgewählt ist.
  7. Schließe alle Browserfenster vollständig und öffne die Seite neu.

Android (ab Version 11)

  1. Das Smartphone muss mit einer sicheren Bildschirmsperre (PIN, Muster, Passwort) geschützt sein.
  2. Gehe in die Einstellungen -> Suche nach "Zertifikat" -> Zertifikat installieren.
  3. Wähle den Typ VPN- und App-Nutzerzertifikat (Wichtig: Nicht WLAN!).
  4. .p12-Datei auswählen, Passwort eingeben und einen Namen vergeben (z. B. "Web-Admin").
  5. Hinweis: Nutze auf Android bevorzugt Chrome oder Edge. Firefox für Android nutzt eigene Speicherstrukturen, die mTLS oft erschweren.

Firefox (Desktop)

Da Firefox den Windows-Speicher ignoriert, muss es direkt im Browser hinterlegt werden:

  1. Öffne die Firefox-Einstellungen -> Datenschutz & Sicherheit.
  2. Ganz unten bei Zertifikate auf Zertifikate anzeigen... klicken.
  3. Wähle den Reiter Ihre Zertifikate -> Klicke auf Importieren...
  4. .p12-Datei auswählen, Passwort eingeben und Firefox neu starten.