Tài liệu độngRoot dựa trên SSL (Client Auth.)

Sep 12 2020

Tôi hiện đang sử dụng xác thực SSL máy khách để bảo vệ nội dung nhạy cảm. Người dùng được yêu cầu nhập chứng chỉ vào trình duyệt của họ mà chúng tôi đã tạo bằng OpenSSL. Khi người dùng truy cập trang web, chúng tôi sẽ chuyển hướng họ đến trang 403 tùy chỉnh nếu họ không có chứng chỉ trong trình duyệt hoặc chuỗi khóa của hệ điều hành. Điều này đạt được bằng cách sử dụng cấu hình Apache sau.

<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>

Tôi muốn thực hiện thêm bước này và giới thiệu một số điều kiện để tải một DocumentRoot cụ thể nếu chúng có chứng chỉ hoặc một DocumentRoot khác nếu chúng không có chứng chỉ ứng dụng khách.

Tóm lại: website.com

  • Người dùng A truy cập bằng SSL máy khách, phục vụ trang web.com từ / var / www / has_ssl
  • Người dùng B truy cập mà không có SSL ứng dụng khách, phục vụ trang web.com từ / var / www / no_ssl

Tôi có thể sử dụng %{SSL:SSL_CLIENT_S_DN_CN} =""để chuyển hướng đến một đường dẫn nếu trống, nhưng tôi không chắc chắn cách viết lại DocumentRoot dựa trên sự hiện diện của chứng chỉ.

Tôi đã phải vật lộn với điều này trong vài ngày. Mọi sự trợ giúp hoặc gợi ý đều được đánh giá cao.

Trả lời

2 MrWhite Sep 12 2020 at 06:17

AFAIK bạn không thể đặt có điều kiện DocumentRoot. Tuy nhiên, bạn có thể viết lại nội bộ yêu cầu bằng cách sử dụng mod_rewrite, giống như cách bạn đang trả lại phản hồi 403 khi SSL máy khách không được đặt.

Ví dụ: nếu bạn đặt:

DocumentRoot /var/www

Sau đó, viết lại nội bộ tất cả các yêu cầu /var/www/has_sslthành công hoặc theo /var/www/no_sslcách khác.

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]

Để ngăn chặn truy cập trực tiếp đến một trong hai /no_sslhoặc /has_sslthư mục con bạn có thể thực hiện một chuyển hướng bên ngoài trước khi các viết lại trên mà loại bỏ các thư mục con từ yêu cầu. Ví dụ:

RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^/(no_ssl|has_ssl)(.*) /$1 [R=301,L]