设置位置指令时,客户端证书认证 sslv3 警报握手失败

设置位置指令时,客户端证书认证 sslv3 警报握手失败

我正在尝试为在 Rails 上运行的 Web 服务设置客户端证书身份验证。该服务在 apache2、passenger 和 mod_ssl 上运行。我已经能够成功生成密钥并为整个域设置客户端证书身份验证。这很正常,但是,当我尝试包含 Location 指令时,我总是收到此错误(来自浏览器和 ruby​​ 客户端):

SSL_connect returned=1 errno=0 state=SSLv3 read finished A: sslv3 alert handshake failure (OpenSSL::SSL::SSLError).  

当我从 curl 运行命令时出现此错误:

curl: (52) Empty reply from server

我删除了该指令,它工作正常。这是我对此虚拟主机的配置。

 <VirtualHost *:443 *:80>
    ServerName wrangler.optimis.local
    DocumentRoot "/Users/jmoore/Sites/data-wrangler/public/"
    RackEnv development
    ErrorLog "/Users/jmoore/Sites/data-wrangler/log/error.log"
    CustomLog "/Users/jmoore/Sites/data-wrangler/log/access.log" common
    SetEnv GEM_HOME /Users/jmoore/.rvm/gems/ree-1.8.7-2010.02
    SetEnv GEM_PATH /Users/jmoore/.rvm/gems/ree-1.8.7-2010.02

# Enable SSL on this domain
SSLEngine on
SSLProtocol ALL
SSLCipherSuite HIGH:MEDIUM
SSLCertificateFile /etc/apache2/ssl.key/new/wrangler_servercert.pem
SSLCertificateKeyFile /etc/apache2/ssl.key/new/wrangler_server.nopass.key

# Enable SSL client certificates, but disable verification for the entire domain (we only want it on specific URLs)
#SSLCACertificatePath /etc/apache2/ssl.key/new/demoCA
SSLCACertificateFile /etc/apache2/ssl.key/new/demoCA/cacert.pem
#SSLCertificateChainFile /etc/apache2/ssl.key/new/demoCA/cacert.pem
#SSLVerifyClient require
SSLVerifyClient none
#SSLVerifyDepth 1

<Location /test>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>

 </VirtualHost>

我的研究表明,这通常是由证书不良引起的,因此我多次重新生成证书,每次它都可以在整个域中正常工作,但当我尝试将其限制在一个位置时会出现握手错误。由于这些配置是 apache 文档建议的,所以我不确定出了什么问题。有人知道如何解决当您尝试将客户端身份验证限制在一个位置时发生的握手问题吗?

答案1

您的服务器是否支持 TLS 重新协商扩展 (RFC 5746)?它是否有一个可以完全阻止重新协商的 OpenSSL 版本(这是 CVE-2009-3555 的临时修复)?

如果SSLVerifyClient仅限于某个位置,则需要第二次握手来重新协商客户端证书。这就是 SSL/TLS 中的安全问题 (CVE-2009-3555) 发生的地方,也是 RFC 5746 修复的问题(前提是客户端也支持它)。

有关版本的更多信息这个 StackOverflow 答案

答案2

问题在于 SSLVerifyClient 指令。如果位于位置或目录中,您将遇到此问题。SSLVerifyClient 要求和 SSLVerifyDepth 必须在虚拟主机级别设置。

相关内容