我正在尝试将 Apache 2.4.29 服务器配置为我的应用程序的 SSL 终止反向代理。代理应在 SSL 握手期间请求客户端证书并将其传递给应用程序进行验证。我使用下一个虚拟主机配置:
<VirtualHost *:443>
# Default settings
DefaultType none
RewriteEngine on
AllowEncodedSlashes on
RewriteCond %{QUERY_STRING} transport=polling
RewriteRule /(.*)$ http://127.0.0.1:8088/$1 [P]
ProxyRequests off
ProxyPass "/" "http://127.0.0.1:8088/"
ProxyPassReverse "/" "http://127.0.0.1:8088/"
RequestHeader set X-Forwarded-Proto "https"
# Default settings
# SSL settings
SSLEngine On
# A file with certificate data in PEM format
# https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcertificatefile
SSLCertificateFile "/path/to/server-chain.cert.pem"
# The PEM-encoded private key file for the server
# https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcertificatekeyfile
SSLCertificateKeyFile "/path/to/server.key.pem"
# SSL Settings
# Client certificate auth settings
SSLOptions +ExportCertData
SSLCACertificateFile "/path/to/ca.cert.pem"
# Enable client certificate authentication
SSLVerifyClient optional_no_ca
# Specify the max depth of the certificate chain
SSLVerifyDepth 3
# Add the client certificate to the request header
#RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT_CHAIN_3}s"
RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s"
# Client certificate auth settings
</VirtualHost>
澄清几点:
- 服务器证书由中间 CA 颁发
- 我编写了
server-chain.cert.pem
包含从服务器证书到 CA 证书的整个链 - 客户端证书由嵌套中间 CA 颁发
CA intermediate CA 1 server certificate intermediate CA 2 client certificate A client certificate B
配置工作正常,我能够从SSL_CLIENT_CERT
我的应用程序传入请求的标头中获取客户端证书。
下一步是验证客户端证书。我想我需要整个客户端证书链。但我只在标头中获得了叶客户端证书。当我尝试使用SSL_CLIENT_CERT_CHAIN_n
变量在我的 Apache 配置中设置标头时(null)
,无论我使用什么,我都会获得标头的值n
。
请建议一种方法来获取从叶客户端证书到指令中指定的父证书的整个客户端证书链SSLCACertificateFile
。
答案1
为了验证客户端证书,服务器需要完整的证书链,因为它。如果您设置了 SSLCACertificateFile,那么这些就是发送给客户端的 CA 证书,但它们不应包含中间证书。您还需要使用更麻烦的 SSLCACertificatePath 来设置中间 CA 证书。