在 SSL 身份验证失败时重定向用户

lin*_*kdd 5 ssl authentication apache-2.2

我配置了一个启用 SSL 和 SSL 客户端身份验证的 VirtualHost,所有这些都在 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>
Run Code Online (Sandbox Code Playgroud)

使用该配置,如果用户没有任何 SSL 证书,他将被正确重定向到错误页面。但是如果他有一个被撤销或过期的证书,握手失败(正常)并且连接被关闭(在浏览器上返回一个 SSL 错误)。

如何告诉 apache2 将用户重定向到正确的页面,而不是在 SSL 握手失败时关闭连接?

Unb*_*ver 1

一种常见的误解是,Web 服务器可以“执行某些操作”,而不是在浏览器中显示大多数(也许是全部)SSL 错误。

这是因为 SSL 握手首先发生并且完全独立于任何 HTTP 通信。尽管我们将其视为一个协议,但 HTTPS 并不是真正与 HTTP 不同的协议,它是“浏览器和服务器之间的 HTTP 和加密通道”。

如果客户端提供无效证书,则 SSL 握手失败,您会收到错误消息。此时尚未发生 HTTP 通信,因此不存在重定向用户的机会。