Apache Client Zertifikat: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(13 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/server.conf
+
*cat /etc/apache2/sites-available/gelb.conf
 
<pre>
 
<pre>
 
<VirtualHost *:443>
 
<VirtualHost *:443>
Zeile 15: Zeile 15:
  
 
     SSLEngine on
 
     SSLEngine on
     SSLCertificateFile /etc/apache2/ssl/gelb.it2XX.int-fullchain.pem
+
     SSLCertificateFile /etc/ssl/own.crt
     SSLCertificateKeyFile /etc/apache2/ssl/gelb.it2XX.int.key
+
     SSLCertificateKeyFile /etc/ssl/own.key
  
     <Directory /var/www/server>
+
     <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==
;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>
 +
;$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>
 
</pre>
 +
;ca-fullchain.crt muss zum Webserver
  
 
==Benutzer für Basic-Auth anlegen==
 
==Benutzer für Basic-Auth anlegen==
Zeile 57: Zeile 67:
  
 
     SSLEngine on
 
     SSLEngine on
     SSLCertificateFile /etc/apache2/ssl/gelb.it2XX.int-fullchain.pem
+
     SSLCertificateFile /etc/ssl/own.crt
     SSLCertificateKeyFile /etc/apache2/ssl/gelb.it2XX.int.key
+
     SSLCertificateKeyFile /etc/ssl/own.key
  
     SSLCACertificateFile /usr/local/share/ca-certificates/ca.crt
+
     SSLCACertificateFile /etc/ssl/ca-fullchain.crt
 +
    SSLVerifyDepth 2
 
     SSLVerifyClient require
 
     SSLVerifyClient require
  
Zeile 85: Zeile 96:
 
;Import
 
;Import
 
* Firefox → Einstellungen → Datenschutz & Sicherheit → Zertifikate anzeigen
 
* Firefox → Einstellungen → Datenschutz & Sicherheit → Zertifikate anzeigen
* Reiter "Ihre Zertifikate" → Importieren → xinux.p12 (Export-Passwort eingeben)
+
* Reiter "Ihre Zertifikate" → Importieren → client.p12 (Export-Passwort eingeben)
 
;Verwendung
 
;Verwendung
 
* Seite aufrufen: https://gelb.it2XX.int
 
* Seite aufrufen: https://gelb.it2XX.int
Zeile 98: Zeile 109:
 
* Zugriff erlaubt
 
* Zugriff erlaubt
 
;Test mit curl
 
;Test mit curl
*curl --cert xinux.crt --key xinux.key -u xinux https://server.it2XX.int
+
*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} == 'xinux'"
+
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

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.