Apache: как отменить экранирование моего клиентского сертификата?
У меня есть конфигурация, в которой nginx завершает https в качестве обратного прокси-сервера, за которым стоит сервер Apache, который обслуживает приложение Perl (openxpki).
Этот сервер Apache должен внедрить сертификат клиента, чтобы openxpki работал.
nginx настроен на передачу сертификата клиента в Apache через заголовок http.X-SSL-CERT
proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;
Важно отметить, что URL-адрес сертификата закодирован здесь nginx. (иначе его нельзя будет передать в строке заголовка)
Теперь Apache должен прочитать заголовок и установить его в ENV:SSL_CLIENT_CERT.
Просто используя
SetEnvIfNoCase X-SSL-CERT "(.*)" SSL_CLIENT_CERT=$1
не будет работать, так как тогда вы получите версию в кодировке URL вENV:SSL_CLIENT_CERT
С использованиемunescape
здесь требуется, чтобы отменить экранирование сертификата, закодированного в URL-адресе. Мне удалось заставить это работать с
# Cannot use unescape directly in SetEnvIfNoCase as it only allows $1,$2, ..
RequestHeader set X-SSL-CERT-UNESCAPED "expr=%{unescape:%{HTTP:X-SSL-CERT}}" early
SetEnvIfNoCase X-SSL-CERT-UNESCAPED "(.*)" SSL_CLIENT_CERT=$1
Это вроде работает... однако....
Это не экранирует все, но косую черту (%2F = '/'). Поскольку сертификат представляет собой материал base64, он часто содержит косую черту -> оставляя фрагменты %2F, что приводит к повреждению сертификата в ENV:SSL_CLIENT_CERT.
Как я могу получить сертификат ('-----BEGIN CERTIFICATE...') в моем Perl-приложении? Как я могу заставить Apache полностью избежать этого?
Я перепробовал все настройкиAllowEncodedSlashes
, но это ничего не изменило
1 ответ
Хорошо, я сам нашел ответ (обходной путь?).
Следующая конфигурация Apache заставляет его работать
RequestHeader set X-SSL-CERT-UNESCAPED "expr=%{unescape:%{HTTP:X-SSL-CERT}}" early
# Fixing broken unescape() in apache config....
# Replace the encoded forward slashes
RequestHeader edit* X-SSL-CERT-UNESCAPED "%2F" "/" early
SetEnvIfNoCase X-SSL-CERT-UNESCAPED "(.*)" SSL_CLIENT_CERT=$1
Хотя похоже на работу с ошибками Apache в языке конфигурации... (например: использованиеearly
не рекомендуется Apache:Early mode is designed as a test/debugging aid for developers
)
Использование Apache за обратным прокси-сервером кажется достаточно распространенным, поэтому должен быть более чистый способ сделать это.
Кто-нибудь знает чистый способ распространения сертификата клиента из Apache в ваше Perl-приложение?