Apache Client Zertifikat: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| (17 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 8: | Zeile 8: | ||
*rm -v /var/www/gelb/.htaccess | *rm -v /var/www/gelb/.htaccess | ||
| − | *cat /etc/apache2/sites-available/ | + | *cat /etc/apache2/sites-available/gelb.conf |
<pre> | <pre> | ||
<VirtualHost *:443> | <VirtualHost *:443> | ||
| Zeile 15: | Zeile 15: | ||
SSLEngine on | SSLEngine on | ||
| − | SSLCertificateFile /etc | + | SSLCertificateFile /etc/ssl/own.crt |
| − | SSLCertificateKeyFile /etc | + | SSLCertificateKeyFile /etc/ssl/own.key |
| − | <Directory /var/www/ | + | <Directory /var/www/gelb> |
Options Indexes FollowSymLinks | Options Indexes FollowSymLinks | ||
AllowOverride All | AllowOverride All | ||
| Zeile 29: | Zeile 29: | ||
</pre> | </pre> | ||
| − | ==Client-Zertifikat erstellen== | + | ==Auf dem CA-Host== |
| − | + | ===Client-Zertifikat erstellen=== | |
*cd ~/intermediate-ca | *cd ~/intermediate-ca | ||
<pre> | <pre> | ||
#Variablen setzen | #Variablen setzen | ||
CA=it2XX-ca | CA=it2XX-ca | ||
| − | + | USER_B=client | |
#CSR erzeugen | #CSR erzeugen | ||
openssl req -new -newkey rsa:2048 -nodes -keyout $USER.key -out $USER.csr -subj "/CN=$USER" | openssl req -new -newkey rsa:2048 -nodes -keyout $USER.key -out $USER.csr -subj "/CN=$USER" | ||
| Zeile 41: | Zeile 41: | ||
openssl x509 -req -in $USER.csr -CA $CA.crt -CAkey $CA.key -CAcreateserial -out $USER.crt -days 365 -extfile <(printf "extendedKeyUsage=clientAuth") | openssl x509 -req -in $USER.csr -CA $CA.crt -CAkey $CA.key -CAcreateserial -out $USER.crt -days 365 -extfile <(printf "extendedKeyUsage=clientAuth") | ||
#PKCS12 für den Browser-Import bauen (Export-Passwort setzen) | #PKCS12 für den Browser-Import bauen (Export-Passwort setzen) | ||
| − | openssl pkcs12 -export -in $ | + | openssl pkcs12 -export -in $USER_B.crt -inkey $USER_B.key -certfile $CA.crt -out $USER_B.p12 |
</pre> | </pre> | ||
| + | ;$USER_B.p12 muss zum Client | ||
| + | |||
| + | ===Intermediate ca=== | ||
| + | <pre> | ||
| + | #Root Zertifikat besorgen | ||
| + | wget https://web.samogo.de/certs/ca.crt | ||
| + | #CA Fullchain erzeugen | ||
| + | cat it213-ca.crt ca.crt > ca-fullchain.crt | ||
| + | </pre> | ||
| + | ;ca-fullchain.crt muss zum Webserver | ||
| + | |||
==Benutzer für Basic-Auth anlegen== | ==Benutzer für Basic-Auth anlegen== | ||
| − | *htpasswd -c /etc/apache2/.htpasswd | + | *htpasswd -c /etc/apache2/.htpasswd martha |
| + | |||
==Apache-Konfiguration erweitern== | ==Apache-Konfiguration erweitern== | ||
;Die CA liegt bereits im System-Store, wir referenzieren die Datei direkt | ;Die CA liegt bereits im System-Store, wir referenzieren die Datei direkt | ||
*ls /usr/local/share/ca-certificates/ | *ls /usr/local/share/ca-certificates/ | ||
| − | *cat /etc/apache2/sites-available/ | + | *cat /etc/apache2/sites-available/gelb.conf |
<pre> | <pre> | ||
<VirtualHost *:443> | <VirtualHost *:443> | ||
| − | ServerName | + | ServerName gelb.it2XX.int |
| − | DocumentRoot /var/www/ | + | DocumentRoot /var/www/gelb |
SSLEngine on | SSLEngine on | ||
| − | SSLCertificateFile /etc | + | SSLCertificateFile /etc/ssl/own.crt |
| − | SSLCertificateKeyFile /etc | + | SSLCertificateKeyFile /etc/ssl/own.key |
| − | SSLCACertificateFile / | + | SSLCACertificateFile /etc/ssl/ca-fullchain.crt |
| + | SSLVerifyDepth 2 | ||
SSLVerifyClient require | SSLVerifyClient require | ||
| − | <Directory /var/www/ | + | <Directory /var/www/gelb> |
Options Indexes FollowSymLinks | Options Indexes FollowSymLinks | ||
AllowOverride All | AllowOverride All | ||
| Zeile 70: | Zeile 83: | ||
</Directory> | </Directory> | ||
| − | ErrorLog ${APACHE_LOG_DIR}/ | + | ErrorLog ${APACHE_LOG_DIR}/gelb_error.log |
| − | CustomLog ${APACHE_LOG_DIR}/ | + | CustomLog ${APACHE_LOG_DIR}/gelb_access.log combined |
</VirtualHost> | </VirtualHost> | ||
| + | |||
| + | |||
</pre> | </pre> | ||
;Config testen und neu laden | ;Config testen und neu laden | ||
*apachectl configtest | *apachectl configtest | ||
*systemctl reload apache2 | *systemctl reload apache2 | ||
| + | |||
==Zertifikat im Firefox einbinden== | ==Zertifikat im Firefox einbinden== | ||
;Import | ;Import | ||
* Firefox → Einstellungen → Datenschutz & Sicherheit → Zertifikate anzeigen | * Firefox → Einstellungen → Datenschutz & Sicherheit → Zertifikate anzeigen | ||
| − | * Reiter "Ihre Zertifikate" → Importieren → | + | * Reiter "Ihre Zertifikate" → Importieren → client.p12 (Export-Passwort eingeben) |
;Verwendung | ;Verwendung | ||
| − | * Seite aufrufen: https:// | + | * Seite aufrufen: https://gelb.it2XX.int |
* Firefox fragt nach Zertifikat → dann HTTP-Login | * Firefox fragt nach Zertifikat → dann HTTP-Login | ||
| + | |||
==Test== | ==Test== | ||
;Kein Zertifikat | ;Kein Zertifikat | ||
| Zeile 92: | Zeile 109: | ||
* Zugriff erlaubt | * Zugriff erlaubt | ||
;Test mit curl | ;Test mit curl | ||
| − | *curl --cert | + | *curl --cert client.crt --key client.key -u martha https://gelb.it2XX.int |
| + | |||
==Optional: Nur bestimmten CN zulassen== | ==Optional: Nur bestimmten CN zulassen== | ||
* SSLVerifyClient prüft nur die Signatur der CA – jedes von ihr ausgestellte Zertifikat wird akzeptiert. | * SSLVerifyClient prüft nur die Signatur der CA – jedes von ihr ausgestellte Zertifikat wird akzeptiert. | ||
;Im Directory-Block ergänzen | ;Im Directory-Block ergänzen | ||
<pre> | <pre> | ||
| − | Require expr "%{SSL_CLIENT_S_DN_CN} == ' | + | Require expr "%{SSL_CLIENT_S_DN_CN} == 'client'" |
</pre> | </pre> | ||
;Testfall: gültiges Zertifikat, falscher CN | ;Testfall: gültiges Zertifikat, falscher CN | ||
Aktuelle Version vom 12. Juni 2026, 12:30 Uhr
Absicherung von Webdiensten mit 2FA: Zertifikat + Passwort
Einführung
- Zwei Faktoren: Besitz (Client-Zertifikat) und Wissen (Passwort).
- Der Server prüft das Client-Zertifikat gegen unsere CA (mTLS), danach folgt HTTP-Basic-Auth.
Ausgangspunkt
- Bestehender Apache-vHost gelb.it2XX.int (Debian) mit fertigem Server-Zertifikat
- Wenn vorhanden
- rm -v /var/www/gelb/.htaccess
- cat /etc/apache2/sites-available/gelb.conf
<VirtualHost *:443>
ServerName gelb.it2XX.int
DocumentRoot /var/www/gelb
SSLEngine on
SSLCertificateFile /etc/ssl/own.crt
SSLCertificateKeyFile /etc/ssl/own.key
<Directory /var/www/gelb>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/gelb_error.log
CustomLog ${APACHE_LOG_DIR}/gelb_access.log combined
</VirtualHost>
Auf dem CA-Host
Client-Zertifikat erstellen
- cd ~/intermediate-ca
#Variablen setzen CA=it2XX-ca USER_B=client #CSR erzeugen openssl req -new -newkey rsa:2048 -nodes -keyout $USER.key -out $USER.csr -subj "/CN=$USER" #Signieren openssl x509 -req -in $USER.csr -CA $CA.crt -CAkey $CA.key -CAcreateserial -out $USER.crt -days 365 -extfile <(printf "extendedKeyUsage=clientAuth") #PKCS12 für den Browser-Import bauen (Export-Passwort setzen) openssl pkcs12 -export -in $USER_B.crt -inkey $USER_B.key -certfile $CA.crt -out $USER_B.p12
- $USER_B.p12 muss zum Client
Intermediate ca
#Root Zertifikat besorgen wget https://web.samogo.de/certs/ca.crt #CA Fullchain erzeugen cat it213-ca.crt ca.crt > ca-fullchain.crt
- ca-fullchain.crt muss zum Webserver
Benutzer für Basic-Auth anlegen
- htpasswd -c /etc/apache2/.htpasswd martha
Apache-Konfiguration erweitern
- Die CA liegt bereits im System-Store, wir referenzieren die Datei direkt
- ls /usr/local/share/ca-certificates/
- cat /etc/apache2/sites-available/gelb.conf
<VirtualHost *:443>
ServerName gelb.it2XX.int
DocumentRoot /var/www/gelb
SSLEngine on
SSLCertificateFile /etc/ssl/own.crt
SSLCertificateKeyFile /etc/ssl/own.key
SSLCACertificateFile /etc/ssl/ca-fullchain.crt
SSLVerifyDepth 2
SSLVerifyClient require
<Directory /var/www/gelb>
Options Indexes FollowSymLinks
AllowOverride All
AuthType Basic
AuthName "Login mit Benutzername und Passwort"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
ErrorLog ${APACHE_LOG_DIR}/gelb_error.log
CustomLog ${APACHE_LOG_DIR}/gelb_access.log combined
</VirtualHost>
- Config testen und neu laden
- apachectl configtest
- systemctl reload apache2
Zertifikat im Firefox einbinden
- Import
- Firefox → Einstellungen → Datenschutz & Sicherheit → Zertifikate anzeigen
- Reiter "Ihre Zertifikate" → Importieren → client.p12 (Export-Passwort eingeben)
- Verwendung
- Seite aufrufen: https://gelb.it2XX.int
- Firefox fragt nach Zertifikat → dann HTTP-Login
Test
- Kein Zertifikat
- TLS-Handshake-Fehler (curl: alert certificate required, kein HTTP-Fehlercode)
- Falsches Passwort
- Fehler 401
- Zertifikat + Passwort korrekt
- Zugriff erlaubt
- Test mit curl
- curl --cert client.crt --key client.key -u martha https://gelb.it2XX.int
Optional: Nur bestimmten CN zulassen
- SSLVerifyClient prüft nur die Signatur der CA – jedes von ihr ausgestellte Zertifikat wird akzeptiert.
- Im Directory-Block ergänzen
Require expr "%{SSL_CLIENT_S_DN_CN} == 'client'"
- Testfall
- gültiges Zertifikat, falscher CN
- Fehler 403
Fazit
- mTLS plus Basic-Auth ergibt eine echte 2-Faktor-Absicherung: Besitz und Wissen.
- SSLCACertificateFile bestimmt, wessen Client-Zertifikate akzeptiert werden – einen Default auf den System-Store gibt es bewusst nicht.