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

Заголовок настройки на основе сертификата клиента

У меня Apache работает как обратный прокси для внутреннего сервера. Пользователи, обращающиеся к прокси-серверу, должны использовать клиентские сертификаты. На внутреннем сервере есть веб-приложение, которое может использовать заголовок HTTP для аутентификации пользователей. Я хотел бы, чтобы прокси предоставлял этот заголовок на основе сертификата клиента.

Значение заголовка - это идентификатор пользователя. В идеале у меня был бы идентификатор пользователя для сопоставления текстового файла с сертификатом. Насколько я могу судить, мне нужно RewriteMap но для заголовков.

# Somehow lookup USERID given SSL_CLIENT_S_DN
RequestHeader set X-User-ID %{USERID}

Я бы хотел избежать целой кучи SetEnvIfs требует перезагрузки сервера для изменения, например:

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 содержит пробелы, вам придется использовать внешнюю программу для создания карты, а не простой текстовый файл (это может работать для других типов карт, но я не пробовал).