我已将 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
。
答案1
我找到了一个完全不使用 mod_rewrite 或 Apache 的解决方案。不幸的是,它只适用于 WSGI 脚本。虽然这不能解决未来的潜在问题,但它确实解决了眼前的需求。需要这个的主要应用程序是 Trac,它对它来说工作得很好。
我正在为 Trac 使用这个 WSGI 脚本:
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 执行其操作之前设置的值。