Хорошо, я потратил на это весь день ...
Я использую apache с mod_ssl. Я пытаюсь взять существующий заголовок среды «% {SSL_CLIENT_S_DN_CN} s», который выглядит как «Фамилия, имя, имя пользователя Mi», и установить новый заголовок с именем USERNAME и установить его равным просто имени пользователя ( символы между последним пробелом и концом строки)
Затем я перевернул бы этот заголовок прокси-серверу на серверный хост, который будет использовать его для идентификации пользователя.
Я перепробовал много разных вещей. Я не знаю, проблема в том, что я не понимаю регулярное выражение Perl, или я не понимаю синтаксис, или я не помещаю его в нужное место, или все три.
Вот пример того, что я пробовал:
SetEnvIf SSL_CLIENT_S_DN_CN (.*\ )(.*) newhostname=$2
RequestHeader set HOSTNAME "%{newhostname}e"
Все, что мне действительно нужно, это новый заголовок Hostname, равный последним непробельным символам в переменной окружения DN_CN.
Хорошо - я понял это в середине недели, но все же хотел дать кому-то шанс заработать награду.
Удивительно, но это нигде не очень хорошо документировано, но, поскольку я использовал для этого mod_headers, вы можете найти эту документацию Вот.
Что ты хочешь сделать установить заголовок, независимо от того, берете ли вы его из ssl или из среды. Затем вы можете редактировать заголовок на месте с использованием регулярных выражений и групп захвата.
Некоторые примеры:
RequestHeader set REMOTE_USER "%{SSL_CLIENT_S_DN_CN}s" RequestHeader edit REMOTE_USER (.*\s)(.*) $2 RequestHeader set AUTHENTICATE_CN "%{SSL_CLIENT_S_DN_CN}s" RequestHeader edit AUTHENTICATE_CN (.*\s)(.*) $1 RequestHeader set AUTHENTICATE_MAIL "%{SSL_CLIENT_S_DN_CN}s" RequestHeader edit AUTHENTICATE_MAIL (.*\s)(.*) $2@gmail.com
Я бы использовал Директива AuthBasicFake который установит заголовок, а затем вы можете сделать ProxyPass В то же самое Блок локации. Это выглядело бы примерно так:
<Location "/blah">
AuthBasicFake %{SSL_CLIENT_S_DN_CN}
ProxyPass http://example.org/blah
</Location>
Если у вас есть другие атрибуты x509 в теме, например, собственное имя пользователя, вы можете использовать SSL_CLIENT_S_DN_uid или SSL_CLIENT_S_DN_email.
Никогда не делал этого с SSL (и я не очень понимаю это здесь), но mod_security может быть ответом. Он может переписывать / добавлять / заменять / исправлять что-либо внутри расшифрованного содержимого.