DocumentRoot dinamico basato su SSL (Autenticazione client)
Attualmente utilizzo l'autenticazione SSL del client per proteggere i contenuti sensibili. Gli utenti sono tenuti a importare un certificato nei loro browser che abbiamo generato utilizzando OpenSSL. Quando un utente visita il sito Web, lo reindirizziamo a una pagina 403 personalizzata se non dispone del certificato nel browser o nel portachiavi del sistema operativo. Ciò si ottiene utilizzando la seguente configurazione di Apache.
<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>
Vorrei fare un ulteriore passo avanti e introdurre alcuni condizionali per caricare un DocumentRoot specifico se hanno il certificato presente, o un altro DocumentRoot se non hanno il certificato client.
In sintesi: website.com
- L'utente A visita con client SSL, serve website.com da / var / www / has_ssl
- L'utente B visita senza client SSL, serve website.com da / var / www / no_ssl
Posso usare %{SSL:SSL_CLIENT_S_DN_CN} =""per reindirizzare a un percorso se vuoto, ma non sono sicuro di come riscrivere DocumentRoot in base alla presenza del certificato.
Ho lottato con questo per alcuni giorni. Qualsiasi assistenza o suggerimento è apprezzato.
Risposte
Per quanto ne so, non è possibile impostare in modo condizionale il file DocumentRoot. Tuttavia, è possibile riscrivere internamente la richiesta utilizzando mod_rewrite, più o meno allo stesso modo in cui si restituisce una risposta 403 quando il client SSL non è impostato.
Ad esempio, se imposti:
DocumentRoot /var/www
Quindi riscrivi internamente tutte le richieste /var/www/has_sslin caso di successo o /var/www/no_sslmeno.
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]
Per impedire l'accesso diretto alle sottodirectory /no_sslo, /has_sslè possibile implementare un reindirizzamento esterno prima della riscrittura di cui sopra che rimuove la sottodirectory dalla richiesta. Per esempio:
RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^/(no_ssl|has_ssl)(.*) /$1 [R=301,L]