DocumentRoot Dinamis Berdasarkan SSL (Client Auth.)
Saat ini saya menggunakan otentikasi SSL Klien untuk melindungi konten sensitif. Pengguna diminta untuk mengimpor sertifikat ke browser mereka yang kami buat menggunakan OpenSSL. Saat pengguna mengunjungi situs web, kami mengarahkan mereka ke halaman 403 kustom jika mereka tidak memiliki sertifikat di browser atau rantai kunci sistem operasi mereka. Ini dicapai dengan menggunakan konfigurasi Apache berikut.
<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>
Saya ingin mengambil langkah lebih jauh dan memperkenalkan beberapa persyaratan untuk memuat DocumentRoot tertentu jika mereka memiliki sertifikat, atau DocumentRoot lain jika mereka tidak memiliki sertifikat klien.
Singkatnya: website.com
- Pengguna A mengunjungi dengan SSL klien, melayani website.com dari / var / www / has_ssl
- Pengguna B mengunjungi tanpa SSL klien, melayani website.com dari / var / www / no_ssl
Saya dapat menggunakan %{SSL:SSL_CLIENT_S_DN_CN} =""untuk mengalihkan ke jalur jika kosong, tetapi saya tidak yakin bagaimana cara menulis ulang DocumentRoot berdasarkan keberadaan sertifikat.
Saya telah berjuang dengan ini selama beberapa hari. Setiap bantuan atau petunjuk dihargai.
Jawaban
AFAIK Anda tidak dapat mengatur secara bersyarat DocumentRoot. Namun, Anda dapat menulis ulang permintaan secara internal menggunakan mod_rewrite, dengan cara yang sama Anda mengembalikan respons 403 saat SSL klien tidak disetel.
Misalnya, jika Anda menyetel:
DocumentRoot /var/www
Kemudian tulis ulang secara internal semua permintaan ke jika /var/www/has_sslberhasil atau /var/www/no_sslsebaliknya.
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]
Untuk mencegah akses langsung ke subdirektori /no_sslatau, /has_sslAnda dapat menerapkan pengalihan eksternal sebelum penulisan ulang di atas yang menghapus subdirektori dari permintaan. Sebagai contoh:
RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^/(no_ssl|has_ssl)(.*) /$1 [R=301,L]