我无法让我的 Apache 代理服务器将用户在浏览器中选择的证书发送到下游服务器。
问题是 SSLProxyMachineCertificateFile。如果我设置此变量,Apache 会忽略我在浏览器中选择的证书并使用此证书。 如果我不设置它,我会收到错误:AH02268:代理客户端证书回调:下游服务器想要客户端证书,但没有配置
我想在 Apache 中为客户端证书设置 CA,并且应该允许来自该 CA 的任何证书并将其传递到下游服务器。
当然有办法做到这一点吗?
虚拟主机设置:
<VirtualHostInstance name='name' certfilename='example.com'>
SecRuleEngine Off
SSLCACertificateFile userCertChain.pem
SSLVerifyClient require
SSLVerifyDepth 10
SSLProxyEngine On
SSLProtocol all -TLSv1.3 -SSLv2 -SSLv3
SSLProxyProtocol all -TLSv1.3 -SSLv2 -SSLv3
#SSLProxyMachineCertificateFile userCertWithKey.pem
SSLProxyMachineCertificateChainFile userCertChain.pem
SSLProxyCACertificateFile downstreamServerFullchain.pem
SSLProxyVerify require
SSLProxyVerifyDepth 10
#SSLProxyCheckPeerName on
SSLProxyCheckPeerCN on
SSLHonorCipherOrder On
ServerName https://example.com:port
ServerAlias *.example.com
LogLevel debug
<Location />
Require all granted
ProxyPass https://example.com/
ProxyPassReverse https://example.com/
</Location>
</VirtualHostInstance>
这是不可能的,请参阅:https://stackoverflow.com/a/20859810/5633214
因此,在对代理进行客户端身份验证之后,我从客户端证书中提取了一些详细信息,并将它们作为请求标头发送到后端服务器:
SecRule SSL:SSL_CLIENT_S_DN_O ".*" \
"phase:1,\
id:'123456',\
pass,\
setenv:O=%{SSL.SSL_CLIENT_S_DN_O}"
RequestHeader set Org %{O}e
有关如何设置标头的信息,请参阅 ModSecurity 文档:https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-%28v3.x%29#user-content-setenv
Apache 文档了解您可以从证书中获取哪些信息:https://httpd.apache.org/docs/current/mod/mod_ssl.html