Назад | Перейти на главную страницу

Перенаправить пользователя при сбое аутентификации SSL

Я настроил VirtualHost с включенным SSL и аутентификацией клиента SSL, все это на apache2 2.2.8 (сервер ubuntu 8.04).

Все сертификаты SSL (CA, сертификат сервера, сертификат клиента, CRL) были созданы с помощью командной строки openssl.

Я хочу перенаправить пользователя на страницу настраиваемой ошибки, если сертификат клиента недействителен (отсутствует, истек или отозван).

Вот конфигурация моего виртуального хоста:

<VirtualHost *:443>
    ServerName myserv.example.com
    DocumentRoot /var/www/myserv/

    CustomLog /var/log/apache2/myserv.access.log combined
    ErrorLog /var/log/apache2/myserv.error.log
    LogLevel warn

    SSLEngine on
    SSLOptions +StdEnvVars +ExportCertData

    SSLCertificateFile "/etc/apache2/ssl/certs/servcrt.pem"
    SSLCertificateKeyFile "/etc/apache2/ssl/private/servkey.pem"

    SSLCACertificateFile "/etc/apache2/ssl/certs/ca.pem"

    SSLCARevocationPath "/etc/apache2/ssl/crl/"
    SSLCARevocationFile "/etc/apache2/ssl/crl/crl.pem"

    <Directory /var/www/myserv/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all

        SSLVerifyClient optional
        SSLVerifyDepth 1

        RewriteEngine on
        RewriteCond %{SSL:SSL_CLIENT_VERIFY} !^SUCCESS$
        RewriteRule .* /error-page.html [L]
    </Directory>
</VirtualHost>

При такой конфигурации, если у пользователя нет сертификата SSL, он правильно перенаправляется на страницу ошибки. Но если у него есть отозванный или просроченный сертификат, рукопожатие не выполняется (обычно) и соединение закрывается (возвращается ошибка SSL в браузере).

Как я могу сказать apache2 перенаправить пользователя на правильную страницу вместо закрытия соединения при сбое подтверждения SSL?

Распространено заблуждение, что веб-сервер может «что-то делать» вместо того, чтобы отображать большинство (а может и все) ошибок SSL в браузере.

Это связано с тем, что рукопожатие SSL происходит первым и полностью независимо от любой связи HTTP. Хотя мы рассматриваем его как единый протокол, HTTPS на самом деле не является протоколом, отличным от HTTP, это «HTTP через зашифрованный канал между вашим браузером и сервером».

Если клиент представляет недействительный сертификат, квитирование SSL не удается, вы получаете сообщение об ошибке. На данный момент HTTP-соединение не произошло, и поэтому нет возможности перенаправить пользователя.