我有 Apache 作为内部服务器的反向代理运行。访问代理的用户需要使用客户端证书。在内部服务器上,有一个可以使用 HTTP 标头对用户进行身份验证的 Web 应用程序。我希望代理根据客户端证书提供该标头。
标头值是用户的 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
...
有什么好方法可以避免用户需要进行两次身份验证?
答案1
我想我明白你需要什么,但如果我错了,请纠正我。这需要三阶段方法。
您使用 aRewriteCond
和 aRewriteMap
将 映射SSL_CLIENT_S_DN
到 a USERID
, aRewriteRule
设置环境变量,然后使用 aRequestHeader
指令根据环境变量设置标头。这应该会导致标头正常传递到内部服务器。
就像是:
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 包含空格,您将必须使用外部程序来执行映射,而不是纯文本文件(它可能适用于其他映射类型,但我自己没有尝试过)。