在 apache 中配置客户端证书认证

在 apache 中配置客户端证书认证

我正在尝试在 Apache 中设置部分Virtualhost以要求客户端身份验证。VirtualHost问题还充当实际 Web 服务器的反向代理。 以下是我所做的:

  • 在我用作 CA 的服务器上创建了ca.crtca.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 禁止”。
  • cURL(使用.p12 文件)由于某种原因无法找到密钥...
  • cURL(使用 .crt 和 .key 文件)进行握手,发送请求,然后说“来自服务器的空回复”。
  • Apache 错误日志不断重复这一行Re-negotiation handshake failed: Not accepted by client!?

这是否在使用客户端身份验证和反向代理之间发生冲突?还是我做错了什么?

答案1

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

答案2

HTTP 客户端仅在协商了 SSL 会话后才发送 HTTP 请求,这意味着服务器仅在设置了 SSL 后才知道客户端请求的 URL。由于您SSLVerifyClient根据 URL 更改了 的值,因此 Apache 无法在首次协商 SSL 会话时请求客户端证书,而是必须在知道 URL 后强制重新协商会话。问题似乎出在这次重新协商上,因此我建议您通过SSLVerifyClient require在块中设置VirtualHost并将其从Location块中删除来测试它。

相关内容