DocumentRoot Dinamis Berdasarkan SSL (Client Auth.)

Sep 12 2020

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

2 MrWhite Sep 12 2020 at 06:17

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]