我正在尝试Virtualhost
在 apache 中设置一部分以要求客户端身份验证。所VirtualHost
讨论的问题还充当实际 Web 服务器的反向代理。这是我所做的:
- 在我用作 CA 的服务器上创建
ca.crt
、ca.csr
和。ca.key
- 将 的配置修改为
VirtualHost
如下所示:
...
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 创建了一个测试客户端证书。
- 将客户端证书安装到 Mac OS X Lion 上的登录钥匙串中,然后手动安装到 Firefox 中。
但我无法浏览到该/clientauth
路径。
- Firefox 表示“SSL 对等方无法协商一组可接受的安全参数。”
- Opera 显示“安全连接:来自服务器的致命错误 (40)”。
- Chrome 和 Safari 显示“HTTP 403 Forbidden”。
- cURL(使用 .p12 文件)由于某种原因找不到密钥...
- cURL(使用 .crt 和 .key 文件)进行握手,发送请求,然后说“来自服务器的空回复”。
- apache 错误日志不断重复该行
Re-negotiation handshake failed: Not accepted by client!?
这是使用客户端身份验证和作为反向代理之间的冲突吗?还是我做错了什么?
HTTP 客户端仅在协商 SSL 会话后才发送 HTTP 请求,这意味着服务器仅在设置 SSL 后才知道客户端请求的 URL。由于您要
SSLVerifyClient
根据 URL 更改 的值,因此 Apache 无法在首次协商 SSL 会话时请求客户端证书,而是必须在知道 URL 后强制重新协商会话。看来问题出在这个重新协商上,所以我建议你在没有这个的情况下通过SSLVerifyClient require
在块中设置VirtualHost
并从块中删除它来测试它Location
。这里的根本问题是重新谈判被拒绝。这源于过去一两年修复 TLS 漏洞的活动,并且在实施新的 TLS 扩展之前有各种拒绝重新协商的临时修复。因此,您需要做的一件事是确保您的 SSL (OpenSSL) 以及您的 Apache HTTPD 尽可能保持最新状态。