Apache Client Zertifikat: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 29: Zeile 29:
 
</pre>
 
</pre>
  
==Client-Zertifikat erstellen==
+
==Auf dem CA-Host==
;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=client
+
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 $USER.crt -inkey $USER.key -certfile $CA.crt -out $USER.p12
+
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==
Zeile 61: Zeile 71:
  
 
     SSLCACertificateFile /etc/ssl/ca-fullchain.crt
 
     SSLCACertificateFile /etc/ssl/ca-fullchain.crt
 +
    SSLVerifyDepth 2
 
     SSLVerifyClient require
 
     SSLVerifyClient require
  

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

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

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.