Wenn du bspw. durch die auf meiner Seite vorhandene Anleitung ein selbst signiertes Client-Zertifikat erstellt hast und mit diesem auch gern Verzeichnisse auf deinem Webserver absichern möchtest, können dir die hier beschriebenen Möglichkeiten sicherlich weiterhelfen.
Alternativ gibt es auch eine Anleitung zur BasicAuth-Methode, mit welcher du Verzeichnisse per Benutzernamen und Passwort schützen kannst.
Anzeige
Du rufst im Pfad /etc/apache2/sites-available
die Datei zur SSL-Konfiguration deines Web-Servers auf. Bspw. im Terminal per nano, oder mit jedem anderen Editor. Schau zunächst in deinem Verzeichnis nach, wie die Datei bei dir heißt.
sudo nano /etc/apache2/sites-available/default-ssl.conf
Je nachdem, ob du mehrere virtuelle Hosts definiert hast, suchst du dir den passenden Abschnitt in der Datei.
Das sollte in den meisten Fällen erst mal so ähnlich aussehen:
<VirtualHost *:443> ServerAdmin admin@server.mail ServerName server-name.tld ServerAlias server-name.tld DocumentRoot /var/www/... <Directory /var/www/.../> AllowOverride All </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /....pem SSLCertificateKeyFile /....pem </VirtualHost>
Allgemein
In jedem Fall müssen die folgenden Zeilen nach DocumentRoot /var/www/...
aufgeführt werden:
SSLCACertificateFile /dein/eigener/pfad/ca_cert/intermediate/certs/ca-chain.cert.pem # Pfad zur Schlüsselkette SSLCARevocationFile /dein/eigener/pfad/ca_cert/intermediate/crl/intermediate.crl.pem # Pfad zur CRL in der ggf. gesperrte Zertifikate aufgeführt werden SSLCARevocationCheck chain no_crl_for_cert_ok SSLVerifyClient optional # optional = Client-Zert. !muss nicht zwingend! für Zugriff vorhanden sein / require = Client-Zert. !muss zwingend! für Zugriff vorhanden sein SSLVerifyDepth 10 SSLOptions +StrictRequire +StdEnvVars
Wichtig sind die Angaben zum SSLCACertificateFile
und zu SSLVerifyClient
. Wird SSLVerifyClien
t hart auf „require“ eingestellt, muss zwingend ein Client-Zertifikat für den Zugriff auf entsprechend geschützte Verzeichnisse vorhanden sein. Wird SSLVerifyClient
auf „optional“ gestellt, kann der Zugriff auf das Verzeichnis auch ohne Zertifikat (bspw. wenn man allgemeinen Inhalt ausgeben möchte, den jeder sehen darf), oder mit der alternativen BasicAuth-Methode erfolgen.
Anzeige
Client-Zertifikat verpflichtend
Also, wenn der Verzeichnisschutz zwingend ein Client-Zertifikat voraussetzen soll, muss wie zuvor beschrieben, für SSLVerifyClient
die Option „require“ gesetzt sein.
Nun wechseln wir in den Abschnitt zwischen <Directory /var/www/.../> AllowOverride All
… </Directory>
. Folgende Inhalte werden eingefügt:
<RequireAll> Require ssl-verify-client Require expr %{SSL_CLIENT_I_DN_O} == "ServerZertifikat_Firmenname" </RequireAll> ErrorDocument 403 "<font style='font-family: calibri, verdana'><b><font style='font-size: 24px'>ZERTIFIKAT NICHT GEFUNDEN</font></b> \ <br><br>Sie benötigen ein Client-Zertifikat um auf diese Seite zugreifen zu können.</font><br><br><hr>"
Es wird lediglich geprüft, dass das Client-Zertifikat von der Zertifizierungsstelle ServerZertifikat_Firmenname
ausgestellt und signiert wurde, egal welche Firmenangabe im Client-Zertifikat (SSL_CLIENT_S_DN_O
) hinterlegt ist. Diese Prüfung macht in jedem Fall Sinn.
Mit der Hinterlegung von ErrorDocument 403
wird noch eine aussagekräftigere Meldung definiert, als sie der Webserver ausgeben würde, wenn kein passendes Zertifikat gefunden wird.
Die Bedingungen, die im Client-Zertifikat vorkommen müssen, um diesem auch den Zugriff auf das Verzeichnis zu gewähren, lassen sich auch erweitern und damit verfeinern. Bspw. so:
Require expr ( %{SSL_CLIENT_I_DN_O} == "ServerZertifikat_Firmenname" \ and %{SSL_CLIENT_S_DN_CN} == "ClientZertifikat_Inhaber" \ and %{SSL_CLIENT_S_DN_OU} in {"ClientZertifikat_Abteilung1", "ClientZertifikat_Abteilung2", "ClientZertifikat_Abteilung ..."} )
Du prüft also, ob das Client-Zertifikat von der Zertifizierungsstelle ServerZertifikat_Firmenname
(SSL_CLIENT_I_DN_O) signiert wurde, ob das Client-Zertifikat für einen bestimmten Benutzer (SSL_CLIENT_S_DN_CN) erstellt wurde und ob dieser in einer der angegebenen Abteilungen (SSL_CLIENT_S_DN_OU) beschäftigt ist.
Nur wenn diese Bedingungen erfüllt sind, ist auch ein Zugriff auf das Verzeichnis möglich.
Fertig kann das Ganze dann also so aussehen:
<VirtualHost *:443> ServerAdmin admin@server.mail ServerName server-name.tld ServerAlias server-name.tld DocumentRoot /var/www/... SSLCACertificateFile /dein/eigener/pfad/ca_cert/intermediate/certs/ca-chain.cert.pem # Pfad zur Schlüsselkette SSLCARevocationFile /dein/eigener/pfad/ca_cert/intermediate/crl/intermediate.crl.pem # Pfad zur CRL in der ggf. gesperrte Zertifikate aufgeführt werden SSLCARevocationCheck chain no_crl_for_cert_ok SSLVerifyClient require SSLVerifyDepth 10 SSLOptions +StrictRequire +StdEnvVars <Directory /var/www/.../> AllowOverride All <RequireAll> Require ssl-verify-client Require expr %{SSL_CLIENT_I_DN_O} == "ServerZertifikat_Firmenname" </RequireAll> ErrorDocument 403 "<font style='font-family: calibri, verdana'><b><font style='font-size: 24px'>ZERTIFIKAT NICHT GEFUNDEN</font></b> \ <br><br>Sie benötigen ein Client-Zertifikat um auf diese Seite zugreifen zu können.<br><br><hr>" </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /....pem SSLCertificateKeyFile /....pem </VirtualHost>
Anzeige
Client-Zertifikat und BasicAuth-Methode kombinieren
Hilfreich, wenn man geschützte Verzeichnisse bereitstellen möchte, den Zugriff aber nicht nur vom Client-Zertifikat abhängig machen kann / will, ist die Option den Zugriffsschutz unter Verwendung beider Möglichkeiten bereitzustellen.
Die Nutzung eines Client-Zertifikats, oder alternativ die der BasicAuth-Methode lassen sich kombinieren.
Wichtig ist hierfür, wie unter den allgemeinen Angaben beschrieben, dass SSLVerifyClient
in diesem Fall auf „optional“ gestellt werden muss.
Um die Kombination aus Client-Zertifikat und BasicAuth-Methode bereitzustellen, muss nach dieser Anpassung folgender Code zum bereits vorhandenen hinzugefügt werden:
AuthType Basic AuthName "Zugriff auf geschütztes Verzeichnis" AuthBasicProvider file AuthUserFile /PFAD/ZU/.htusers Require user BENUTZER_IN_HTUSERS1, BENUTZER_IN_HTUSERS2 ...
Das ErrorDocument 403
wird nun noch durch ErrorDocument 401
ersetzt, da der Webserver diesen Fehlercode zurückmelden wird, wenn weder Client-Zertifikat vorhanden ist, noch die Anmeldedaten für die BasicAuth-Methode korrekt sind.
ErrorDocument 401 "<font style='font-family: calibri, verdana'><b><font style='font-size: 24px'>UNGÜLTIGE ANMELDEDATEN</font></b> \ <br><br>Sie benötigen Zugangsdaten, oder ein Client-Zertifikat um auf diese Seite zugreifen zu können.<br><br><hr></font>"
Zusammen sieht das Ganze dann bspw. so aus:
<VirtualHost *:443> ServerAdmin admin@server.mail ServerName server-name.tld ServerAlias server-name.tld DocumentRoot /var/www/... SSLCACertificateFile /dein/eigener/pfad/ca_cert/intermediate/certs/ca-chain.cert.pem # Pfad zur Schlüsselkette SSLCARevocationFile /dein/eigener/pfad/ca_cert/intermediate/crl/intermediate.crl.pem # Pfad zur CRL in der ggf. gesperrte Zertifikate aufgeführt werden SSLCARevocationCheck chain no_crl_for_cert_ok SSLVerifyClient optional SSLVerifyDepth 10 SSLOptions +StrictRequire +StdEnvVars <Directory /var/www/.../> AllowOverride All <RequireAll> Require ssl-verify-client Require expr %{SSL_CLIENT_I_DN_O} == "ServerZertifikat_Firmenname" </RequireAll> AuthType Basic AuthName "Zugriff auf geschütztes Verzeichnis" AuthBasicProvider file AuthUserFile /PFAD/ZU/.htusers Require user BENUTZER_IN_HTUSERS1, BENUTZER_IN_HTUSERS2 ... ErrorDocument 401 "<font style='font-family: calibri, verdana'><b><font style='font-size: 24px'>UNGÜLTIGE ANMELDEDATEN</font></b> \ <br><br>Sie benötigen Zugangsdaten, oder ein Client-Zertifikat um auf diese Seite zugreifen zu können.<br><br><hr></font>" </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /....pem SSLCertificateKeyFile /....pem </VirtualHost>
Anzeige