我有Apache作为内部服务器的反向代理运行。 用户点击代理需要使用客户端证书。 在内部服务器上,有一个Web应用程序可以使用HTTP标头来validation用户。 我希望代理提供基于客户端证书的头。
标题值是用户的ID。 理想情况下,我会有一个文本文件映射用户ID证书。 据我所知,我需要RewriteMap而不是头文件。
# Somehow lookup USERID given SSL_CLIENT_S_DN RequestHeader set X-User-ID %{USERID}
我想避免一大堆SetEnvIf需要重新启动服务器来更改,例如:
SetEnvIf SSL_CLIENT_S_DN [User 1's SSL_CLIENT_S_DN] USERID=12 SetEnvIf SSL_CLIENT_S_DN [User 2's SSL_CLIENT_S_DN] USERID=34 SetEnvIf SSL_CLIENT_S_DN [User 3's SSL_CLIENT_S_DN] USERID=56 ...
有没有一种好的方法可以避免用户需要进行两次实质性的validation?
我想我明白你的需要,但如果我错了,请纠正我。 这需要3阶段的方法。
您可以使用带有RewriteMap的RewriteCond将SSL_CLIENT_S_DN映射到USERID ,使用RewriteRule来设置环境variables,然后使用RequestHeader指令来设置基于环境variables的标头。 这应该导致标题正常传递到内部服务器上。
就像是:
RewriteEngine On # Define a RewriteMap for DN to user id RewriteMap dntouserid "txt:/path/to/dntouserid.txt" # Test if we have something in the map for a the current DN RewriteCond ${dntouserid:%{SSL:SSL_CLIENT_S_DN}} (.+) # Set environment variable based on that mapping. %1 comes from the RewriteCond RewriteRule ^ - [E=MYUSER:%1] # Set header to that environment variable RequestHeader set X-User-ID %{MYUSER}e
然后你的地图包含如下行:
DN_OF_USER1 12 DN_OF_USER2 34 DN_OF_USER3 56
如果DN包含空格,则必须使用外部程序来执行地图而不是纯文本文件(它可能适用于其他地图types,但我没有尝试自己)。