Я пытаюсь настроить сервер 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>
Немного разъяснения:
server-chain.cert.pem
содержать всю цепочку от сертификата сервера до сертификата CACA
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
директива.
Для проверки сертификата клиента серверу требуется полная цепочка сертификатов, поскольку он. Если вы устанавливаете SSLCACertificateFile, то это сертификаты CA, которые отправляются клиенту, но они не должны содержать промежуточный сертификат. Вам также нужно будет использовать более громоздкий SSLCACertificatePath для установки промежуточных сертификатов ЦС.