DocumentRoot dinamico basato su SSL (Autenticazione client)

Sep 12 2020

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

2 MrWhite Sep 12 2020 at 06:17

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]