Вопрос от новичка 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 ...