Dynamic DocumentRoot basierend auf SSL (Client Auth.)

Sep 12 2020

Ich verwende derzeit die Client-SSL-Authentifizierung, um vertrauliche Inhalte zu schützen. Benutzer müssen ein Zertifikat in ihre Browser importieren, das wir mit OpenSSL generiert haben. Wenn ein Benutzer die Website besucht, leiten wir ihn auf eine benutzerdefinierte 403-Seite weiter, wenn er das Zertifikat nicht in seinem Browser oder im Schlüsselbund seines Betriebssystems hat. Dies wird mit der folgenden Apache-Konfiguration erreicht.

<VirtualHost *:443>
    ServerName host.tld
    ServerAlias www.host.tld

    ServerAdmin [email protected]
    DocumentRoot /var/www/path

    ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine on
    SSLProtocol             all -SSLv2 -SSLv3

    SSLCertificateFile /etc/ssl/host/host.crt
    SSLCertificateKeyFile /etc/ssl/host.key
    SSLCACertificateFile /etc/ssl/cacert.pem
    SSLVerifyClient optional
    SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
    SSLVerifyDepth 10
#   SSLCARevocationPath /etc/ssl/crl
    SSLCARevocationFile /etc/ssl/ca.crl
    SSLCARevocationCheck chain

    RewriteEngine        on
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteCond     %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
    RewriteRule     .? - [F]
    ErrorDocument 403 /403.html
    
</VirtualHost>

Ich möchte noch einen Schritt weiter gehen und einige Bedingungen zum Laden eines bestimmten DocumentRoot einführen, wenn das Zertifikat vorhanden ist, oder eines anderen DocumentRoot, wenn das Client-Zertifikat nicht vorhanden ist.

Zusammenfassend: website.com

  • Benutzer A besucht mit Client-SSL die Website.com unter / var / www / has_ssl
  • Benutzer B besucht ohne Client-SSL die Website.com unter / var / www / no_ssl

Ich kann verwenden %{SSL:SSL_CLIENT_S_DN_CN} ="", um auf einen leeren Pfad umzuleiten, bin mir jedoch nicht sicher, wie ich DocumentRoot basierend auf dem Vorhandensein des Zertifikats neu schreiben soll.

Ich habe seit ein paar Tagen damit zu kämpfen. Jede Unterstützung oder Hinweise wird geschätzt.

Antworten

2 MrWhite Sep 12 2020 at 06:17

AFAIK Sie können das nicht bedingt einstellen DocumentRoot. Sie können die Anforderung jedoch intern mit mod_rewrite neu schreiben, ähnlich wie Sie eine 403-Antwort zurückgeben, wenn das Client-SSL nicht festgelegt ist.

Wenn Sie beispielsweise Folgendes festlegen:

DocumentRoot /var/www

Schreiben Sie dann intern alle Anfragen nach /var/www/has_sslErfolg oder auf /var/www/no_sslandere Weise neu.

RewriteEngine on

RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteRule ^ /no_ssl%{REQUEST_URI} [L]

RewriteCond %{SSL:SSL_CLIENT_VERIFY} =SUCCESS
RewriteRule ^ /has_ssl%{REQUEST_URI} [L]

Um einen direkten Zugriff auf das Unterverzeichnis /no_ssloder das /has_sslUnterverzeichnis zu verhindern, können Sie vor den obigen Umschreibungen eine externe Umleitung implementieren , die das Unterverzeichnis aus der Anforderung entfernt. Beispielsweise:

RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^/(no_ssl|has_ssl)(.*) /$1 [R=301,L]