在apache中configuration客户端证书authentication

我正在尝试在apache中设置一个Virtualhost一部分来要求客户端身份validation。 所讨论的VirtualHost也充当实际Web服务器的反向代理。 这是我所做的:

  • 在我用作CA的服务器上创buildca.crtca.csrca.key
  • 修改VirtualHost的configuration看起来像这样:

 ProxyPass / http://xxx.xxx.xxx.xxx:80/ ProxyPassReverse / http://xxx.xxx.xxx.xxx:80/ ProxyPassReverseCookiePath / / SSLEngine On SSLCertificateFile "/private/etc/apache2/server.crt" SSLCertificateKeyFile "/private/etc/apache2/server.key" SSLCertificateChainFile "/private/etc/apache2/ca_bundle.crt" SSLCACertificateFile "/private/etc/apache2/self_ca.crt" SSLVerifyClient none SSLOptions StrictRequire SSLProtocol all -SSLv2 SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL <Location /clientauth> # These options force the client to authenticate with a client certificate. SSLVerifyClient require SSLVerifyDepth 1 </Location> 
  • 使用我的自定义CA创build了testing客户端证书。
  • 将客户端证书安装到Mac OS X Lion上的login钥匙串中,然后手动安装到Firefox中。

但是我无法浏览到/clientauthpath。

  • Firefox说“SSL对等端无法协商一套可接受的安全参数”。
  • Opera说:“安全连接:致命的错误(40)从服务器。”
  • Chrome和Safari说“HTTP 403禁止”。
  • cURL(使用.p12文件)出于某种原因找不到密钥…
  • cURL(使用.crt和.key文件)进行握手,发送请求,然后显示“来自服务器的空回复”。
  • apache错误日志不断重复行Re-negotiation handshake failed: Not accepted by client!?

这是使用客户端身份validation和作为反向代理之间的冲突吗? 还是我做了一些其他的错误?

这里的根本问题是重新谈判拒绝。 这源于过去一两年来修复TLS漏洞的活动,并且在实施新的TLS扩展之前存在各种拒绝重新协商的临时修复。 因此,您需要做的一件事是确保您的SSL(OpenSSL)以及可能的Apache HTTPD尽可能保持最新。

一旦SSL会话被协商,HTTP客户端只发送HTTP请求,这意味着一旦SSL被build立,服务器只知道客户端请求的URL。 由于您正在根据URL更改SSLVerifyClient的值, SSLVerifyClient在首次协商SSL会话时,Apache不能请求客户端证书,而必须在知道URL后强制重新协商会话。 看来问题在于这个重新协商,所以我build议你在没有这个的情况下通过在VirtualHost块中设置SSLVerifyClient require并从Location块中移除它来testing它。