Назад | Перейти на главную страницу

Прокси-сервер Apache 2.4 получает аутентификацию клиента, но не передает ее tomcat

Ранее у меня был Apache 2.2.17, работающий как обратный прокси-сервер, который запрашивал аутентификацию клиента (используя SSLVerifyClient) и передавал эту аутентификацию сервлету приложения jetty / tomcat. Затем мое приложение Java считывает эту информацию (x509Certificate) из запроса.

При обновлении до новых серверов мы решили перейти на последнюю версию Apache, но этот процесс, похоже, больше не работает. Apache по-прежнему запрашивает аутентификацию клиента, но, похоже, не передает ее Tomcat.

Вот соответствующие части рабочего (v2.2.17) файла httpd.conf:

<VirtualHost _default_:443>

    ServerName xxxxxxxx
    SSLEngine On

    SSLCertificateFile conf/ssl-prod/xxxxxxxx.crt
    SSLCertificateKeyFile conf/ssl-prod/xxxxxxxx.key
    SSLCACertificatePath conf/ssl.certs/

    <Location />
        ProxyPass http://xxxxxxxx:8009/
        ProxyPassReverse http://xxxxxxxx:8009/

        Order deny,allow
        Allow from all
    </Location>

    <Location /login/>
        SSLVerifyClient optional
        SSLVerifyDepth 10

        ProxyPass http://xxxxxxxx:8009/
        ProxyPassReverse http://xxxxxxxx:8009/

        Order deny,allow
        Allow from all
    </Location>

</VirtualHost>

Таким образом, это просто стандартный SSL-прокси, пока пользователь не перейдет на страницу в папке «входа в систему», после чего apache запросит аутентификацию клиента.

Я попытался установить несколько других переменных, чтобы увидеть, заставит ли это работать ProxyAddHeaders On ProxyPreserverHost On (и Off), но безуспешно.

У нас также была такая же проблема при переходе на последнюю версию ветки 2.2.23, но когда мы скопировали старую версию, которую мы использовали, на новый сервер, она работала нормально. Единственное другое отличие состоит в том, что мы переходим с 32-разрядного сервера на 64-разрядный (обе Windows используют исполняемые файлы ApacheLounge).

Любые идеи?

У вас нет никакого механизма для передачи информации об аутентифицированном клиенте на сервер Tomcat.

AJP - это протокол, который по умолчанию используется на порте 8009, а не HTTP, и в нем есть встроенные механизмы для передачи данных сертификата клиента (если SSLOptions +ExportCertData есть в Apache). Вы уверены, что не собираетесь этим пользоваться?

Если нет, вам нужно будет реализовать что-то, чтобы справиться с этим, как в Apache, так и в вашем приложении Tomcat. Вероятно, HTTP-заголовок с информацией о сертификате клиента.