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.
- Vorteil: Keine VPN-Einwahl nötig, mathematisch unknackbar (kein Brute-Force möglich).
- Vergleich: Ähnlich wie der SSH-Login via Public-Key anstelle eines Passworts.
- Transportschutz: Die Zertifikatsdatei (
.p12) ist durch ein separates Passwort geschützt. Falls sie gestohlen wird, kann sie ohne das Passwort nicht importiert werden.
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.
- Kopiere die
myCA.pemauf dem Server nach/etc/apache2/ssl/myCA.pem. - 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>
- 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.)
- Drücke
Win + R, tippecertmgr.mscein und drücke Enter (Windows-Zertifikatsmanager). - Navigiere links zu Eigene Zertifikate -> Zertifikate.
- Rechtsklick im rechten, leeren Feld -> Alle Aufgaben -> Importieren...
- Wähle die
client.p12aus (Filter ggf. auf "Alle Dateien" stellen). - Gib das Export-Passwort ein.
- Stelle sicher, dass als Speicherort explizit Eigene Zertifikate ausgewählt ist.
- Schließe alle Browserfenster vollständig und öffne die Seite neu.
Android (ab Version 11)
- Das Smartphone muss mit einer sicheren Bildschirmsperre (PIN, Muster, Passwort) geschützt sein.
- Gehe in die Einstellungen -> Suche nach "Zertifikat" -> Zertifikat installieren.
- Wähle den Typ VPN- und App-Nutzerzertifikat (Wichtig: Nicht WLAN!).
.p12-Datei auswählen, Passwort eingeben und einen Namen vergeben (z. B. "Web-Admin").- 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:
- Öffne die Firefox-Einstellungen -> Datenschutz & Sicherheit.
- Ganz unten bei Zertifikate auf Zertifikate anzeigen... klicken.
- Wähle den Reiter Ihre Zertifikate -> Klicke auf Importieren...
.p12-Datei auswählen, Passwort eingeben und Firefox neu starten.