У меня установлен Apache, чтобы требовать сертификат клиента. К сожалению, REMOTE_USER
встречается неприятная длинная строка из сертификата. Это проблематично для таких приложений, как Trac, которые используют его для имени пользователя. Мне удалось заставить Apache сопоставить сертификат с более разборчивым именем пользователя, используя:
RewriteMap certmap txt:/var/www/certmap.txt
RewriteRule .* - [E=REMOTE_USER:${certmap:%{SSL:SSL_CLIENT_S_DN_CN}}]
Это отлично работает, за исключением первого запроса. В первом запросе REMOTE_USER
как пустая строка, но следующее действие (например, щелчок по ссылке) приводит к установке значения. В Trac эффект заключается в том, что пользователь не вошел в систему изначально, но после того, как что-то сделал.
Есть ли способ получить REMOTE_USER
установить изначально? Или, если это невозможно, может ли перенаправление или два позаботиться о «нажатии на ссылку»?
редактировать
Неудивительно, что IE приходится вмешиваться в дела. Этот метод просто не работает в IE (8): клиент Переменные SSL недоступны в любой момент при попытке использовать RewriteRule
.
Я нашел решение, которое вообще не использует mod_rewrite или Apache. К сожалению, это работает только со сценариями WSGI. Хотя это не решит потенциальную проблему в будущем, но решит насущную потребность. Основное приложение, которому это нужно, - Trac, для которого это прекрасно работает.
Я использую этот сценарий WSGI для Trac:
def application(environ, start_response):
common_name = environ['SSL_CLIENT_S_DN_CN']
user_mapped = False
file = open('/var/www/cert-map.txt')
for line in file:
if not line or line.startswith('#'):
continue
parts = line.split()
if len(parts) < 2:
continue
if common_name == parts[0]:
environ['REMOTE_USER'] = parts[1]
user_mapped = True
break
file.close()
if not user_mapped:
environ['REMOTE_USER'] = common_name
return trac.web.main.dispatch_request(environ, start_response)
По сути, он устанавливает значение REMOTE_USER
прежде, чем Trac сделает свое дело.
Делает http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslusername не делать работу?