Заставить Apache передать клиентский сертификат в качестве заголовка серверу приложений без запроса в браузере? - PullRequest
0 голосов
/ 05 апреля 2019

Вопрос от новичка HTTPD. Таким образом, у нас есть сервер Apache HTTP (2.4.38) в качестве прокси-сервера завершения SSL, который пересылает запросы Apache Tomcat через AJP. Требуется передать сертификат клиента в заголовке запроса без каких-либо проверок (они выглядят довольно сложными и поэтому выполняются на сервере приложений).

Это просто, и что-то похожее на приведенное ниже в конфигурации Apache подойдет:

SSLVerifyClient optional_no_ca
SetEnvIf ^X-SSL-certificate$ .+ X_SSL_CERTIFICATE_HEADER_PRESENT
RequestHeader set X-SSL-certificate "%{SSL_CLIENT_CERT}s" env=!X_SSL_CERTIFICATE_HEADER_PRESENT

Теперь у нас также есть веб-страница Swagger UI, которая позволяет играть с REST API (т.е. фактически выполняет те же запросы REST API из вашего браузера). Но с вышеупомянутой конфигурацией браузер будет постоянно отображать всплывающее окно «Выбор сертификата», которое мы хотим избежать, потому что здесь не имеет значения его действительный сертификат - он заменяется поддельным на сервере приложений, если он видит, что он поступает из Swagger UI ( анализируя заголовок REFERER, который не очень надежное решение, я согласен).

Единственное решение, которое мне удалось найти, это добавить

SSLCACertificateFile conf/ssl/server.crt

с поддельным центром сертификации, который никто никогда не сможет использовать в качестве сертификата эмитента (в данном случае это сертификат по умолчанию, поставляемый с Apache). AFAIU SSLCADNRequestFile должен был помочь здесь, но каким-то образом это никак не повлияло ... Таким образом, вы все равно можете предоставить PEM / ключ, например, из. Почтальон, но браузер не будет отображать всплывающее окно, потому что у вас нет сертификата, который подходит.

Главный вопрос, как мне добиться этого правильным путем? Очевидно, что уродливый обходной путь с поддельным SSLCACertificateFile не такой, каким он должен быть IHMO ...

Обновление № 1

Хорошо, это в конечном итоге превратилось в следующее:

SSLVerifyClient none
SSLOptions +ExportCertData

RequestHeader set X-SSL-certificate ""

<Location ~ "/app-url">
    <If "%{HTTP_REFERER} !~ /swagger-ui\.html/">
        SSLVerifyClient optional_no_ca
        RequestHeader set X-SSL-certificate "%{SSL_CLIENT_CERT}e"
    </If>
</Location>

ИМХО все еще выглядит хакерским, но, по крайней мере, не таким уродливым. Хотя люди говорят, что это не будет работать с TLS 1.3 ...

...