我有Apache设置要求客户端证书。 不幸的是, REMOTE_USER遇到了来自证书的令人讨厌的长string。 对于像Trac这样的应用程序来说,这对用户名是有问题的。 我已经能够使Apache将证书映射到更清晰的用户名,使用:
RewriteMap certmap txt:/var/www/certmap.txt RewriteRule .* - [E=REMOTE_USER:${certmap:%{SSL:SSL_CLIENT_S_DN_CN}}]
这工作得很好,除了第一个请求。 第一个请求将REMOTE_USER作为空string,但下一个操作(即单击链接)会导致设置的值。 在Trac中,效果是用户最初没有login,但在他们做任何事情之后。
有什么办法让REMOTE_USER最初设置? 或者,如果这是不可能的,redirect或两个可以照顾“点击链接”?
编辑
毫不奇怪的是,IE必须把事情搞砸了。 这个方法在IE(8)中不起作用:当尝试使用RewriteRule时, 客户端 SSLvariables在任何时候都不可用。
我发现一个解决scheme,根本就不使用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)
本质上,它是在Trac完成它的事情之前设置REMOTE_USER的值。