Я настроил 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-соединение не произошло, и поэтому нет возможности перенаправить пользователя.