Я настроил VirtualHost с включенным SSL и аутентификация клиента SSL, все это на apache2 2.2.8 (сервер человечности 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-соединение не произошло, и поэтому нет возможности перенаправить пользователя.