我正在尝试将客户端证书链和根从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_客户端_CERT_链未传递给后端服务器
但答案并没有解决我的问题。你知道他们为什么不被通过吗?谢谢。
发布于 2019-09-19 14:50:31
回答我自己的问题以供参考。
之所以没有传递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_到达_同侪_证书_chain.html中,该函数只返回对等方发送的对等链。这就是中间和根被作为null传递的原因,因为在我的例子中,它们是从信任存储而不是从客户端获得的。
https://serverfault.com/questions/984804
复制相似问题