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-приложение?

Другие вопросы по тегам