У меня Apache работает как обратный прокси для внутреннего сервера. Пользователи, обращающиеся к прокси-серверу, должны использовать клиентские сертификаты. На внутреннем сервере есть веб-приложение, которое может использовать заголовок HTTP для аутентификации пользователей. Я хотел бы, чтобы прокси предоставлял этот заголовок на основе сертификата клиента.
Значение заголовка - это идентификатор пользователя. В идеале у меня был бы идентификатор пользователя для сопоставления текстового файла с сертификатом. Насколько я могу судить, мне нужно RewriteMap
но для заголовков.
# Somehow lookup USERID given SSL_CLIENT_S_DN
RequestHeader set X-User-ID %{USERID}
Я бы хотел избежать целой кучи SetEnvIf
s требует перезагрузки сервера для изменения, например:
SetEnvIf SSL_CLIENT_S_DN [User 1's SSL_CLIENT_S_DN] USERID=12
SetEnvIf SSL_CLIENT_S_DN [User 2's SSL_CLIENT_S_DN] USERID=34
SetEnvIf SSL_CLIENT_S_DN [User 3's SSL_CLIENT_S_DN] USERID=56
...
Есть ли хороший способ избежать необходимости дважды аутентифицировать пользователей?
Думаю, я понимаю, что вам нужно, но, пожалуйста, поправьте меня, если я ошибаюсь. Это требует трехэтапного подхода.
Вы используете RewriteCond
с RewriteMap
составить карту SSL_CLIENT_S_DN
к USERID
, а RewriteRule
чтобы установить переменную среды, а затем RequestHeader
директива для установки заголовка на основе переменной среды. Это должно привести к нормальной передаче заголовка на внутренний сервер.
Что-то вроде:
RewriteEngine On
# Define a RewriteMap for DN to user id
RewriteMap dntouserid "txt:/path/to/dntouserid.txt"
# Test if we have something in the map for a the current DN
RewriteCond ${dntouserid:%{SSL:SSL_CLIENT_S_DN}} (.+)
# Set environment variable based on that mapping. %1 comes from the RewriteCond
RewriteRule ^ - [E=MYUSER:%1]
# Set header to that environment variable
RequestHeader set X-User-ID %{MYUSER}e
И тогда ваша карта содержит такие строки, как:
DN_OF_USER1 12
DN_OF_USER2 34
DN_OF_USER3 56
Если DN содержит пробелы, вам придется использовать внешнюю программу для создания карты, а не простой текстовый файл (это может работать для других типов карт, но я не пробовал).