如何配置Apache httpd以信任特定的客户端证书?
我们需要将对Web服务的访问权限限制为特定(已知)合作伙伴的服务器 我们计划为此使用基于CA的解决方案(一个可靠的CA,只有在我们接受它们时才会签署值得信赖的CSR);但是,我们公司的CA不会为外部公司创建证书。
为了建立安全连接,在必要的PKI准备就绪之前,我们希望在Apache httpd代理上配置特定的客户端证书。
但httpd不接受客户端的连接,客户端尝试使用客户端证书进行连接,该客户端证书已添加到CACertificateFile(以Base64和DER格式(PEM)编码的串联x509证书),已配置为虚拟主机。
在这种情况下,客户端证书不是自签名证书。
答案 0 :(得分:4)
您应该通过SSLCACertificateFile
或SSLCACertificatePath
配置您信任的CA证书并使用SSLVerifyClient
(optional
或required
,而不是optional_no_ca
, (不会执行任何身份验证)使服务器请求客户端证书。
如果您在SSLVerifyClient
部分中直接使用VirtualHost
,则会在初始握手期间发送客户端证书。如果您将其置于Directory
/ .htaccess
范围内,则会重新协商客户端证书。
在初始握手中发送证书时,调试更容易,因为客户端证书本身不会被加密。您应该能够通过使用Wireshark(在客户端发送的Certificate
消息中)查看流量来查看它。在调试时,值得检查服务器发送Certificate Request
消息,并查看其证书颁发机构列表。
问题的典型原因是,如果需要,客户端无法识别该列表或未在其链中发送其中间CA证书的客户端。
如果您想更具体地授权某些证书,可以检查变量SSL变量(例如SSL_CLIENT_S_DN_*
)并在SSLRequire
指令中使用它(参见example)。