我正在尝试在apache中设置一个Virtualhost一部分来要求客户端身份validation。 所讨论的VirtualHost也充当实际Web服务器的反向代理。 这是我所做的:
ca.crt , ca.csr和ca.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>
但是我无法浏览到/clientauthpath。
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它。