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

Сопоставление сертификата клиента с именем пользователя

У меня установлен 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 не делать работу?