无法从 apache 获取客户端证书链

无法从 apache 获取客户端证书链

我正在尝试将客户端证书链和根从 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_nSSL_CLIENT_ROOT_CERT字段。根据 openssl 文档,https://www.openssl.org/docs/man1.1.0/man3/SSL_get_peer_cert_chain.html,该函数仅返回对等方发送的对等链。这就是中间和根被传递为空的原因,因为在我的例子中,它们是从信任存储而不是客户端获得的。

相关内容