Dynamic DocumentRoot basierend auf SSL (Client Auth.)
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
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]