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

Dan*_*bbs 8 certificate authentication ssl-certificate certificate-authority apache-2.2

我正在尝试Virtualhost在 apache 中设置部分 a以要求客户端身份验证。该VirtualHost问题也作为实际的Web服务器的反向代理。这是我所做的:

  • 在我用作 CA 的服务器上创建ca.crtca.csrca.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>
Run Code Online (Sandbox Code Playgroud)
  • 使用我的自定义 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!?

这是使用客户端身份验证和作为反向代理之间的冲突吗?还是我做错了什么?

mgo*_*ven 5

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


use*_*421 5

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