我正在尝试将客户端证书链和根从 apache 获取到我的 Java 后端。
这是我的 apache 配置的相关部分:
SSLOptions +StdEnvVars +ExportCertData
RequestHeader set "SSL_CLIENT_CERT" "%{SSL_CLIENT_CERT}e"
RequestHeader set "SSL_CLIENT_CERT_CHAIN_0" "%{SSL_CLIENT_CERT_CHAIN_0}e"
RequestHeader set "SSL_CLIENT_ROOT_CERT" "%{SSL_CLIENT_ROOT_CERT}e"
我能够获得客户端证书,但根证书和中级证书是null
。我已从 tcpdump 验证根证书和中级证书已发送到 apache。
我的apache版本是2.4.6。
我看过类似的问题
如何在使用 Apache 进行证书认证期间获取客户端证书链?
SSL_CLIENT_CERT_CHAIN 未传递给后端服务器
但答案并没有解决我的问题。有什么想法为什么它们没有被传递?谢谢。
答案1
回答我自己的问题以供参考。
SSL_CLIENT_CERT_CHAIN_0
和未被传递的原因SSL_CLIENT_ROOT_CERT
是它们是从客户端上传的证书中提取的。我假设它们是从信任存储中提取的,但查看 httpd 源代码后我发现并非如此。
httpd 调用 openssl 函数 SSL_get_peer_cert_chain()
来填充 SSL_CLIENT_CERT_CHAIN_n
和SSL_CLIENT_ROOT_CERT
字段。根据 openssl 文档,https://www.openssl.org/docs/man1.1.0/man3/SSL_get_peer_cert_chain.html,该函数仅返回对等方发送的对等链。这就是中间和根被传递为空的原因,因为在我的例子中,它们是从信任存储而不是客户端获得的。