根据客户端证书设置标头

Mat*_*obs 6 authentication reverse-proxy apache-2.2

我有 Apache 作为内部服务器的反向代理运行。访问代理的用户需要使用客户端证书。在内部服务器上,有一个 Web 应用程序可以使用 HTTP 标头对用户进行身份验证。我想让代理根据客户端证书提供该标头。

标头值是用户的 id。理想情况下,我会有一个将用户 ID 映射到证书的文本文件。据我所知,我只需要RewriteMap标题。

# Somehow lookup USERID given SSL_CLIENT_S_DN
RequestHeader set X-User-ID %{USERID}
Run Code Online (Sandbox Code Playgroud)

我想避免一大堆SetEnvIf需要重新启动服务器才能更改的s,例如:

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
...
Run Code Online (Sandbox Code Playgroud)

有什么好方法可以避免用户基本上需要进行两次身份验证?

Unb*_*ver 0

我想我明白你的需要,但如果我错了,请纠正我。这需要一个三阶段的方法。

您使用 aRewriteCond和 aRewriteMap将 映射SSL_CLIENT_S_DN到 a USERID, aRewriteRule设置环境变量,然后使用RequestHeader指令根据环境变量设置标头。这应该会导致标头正常传递到内部服务器。

就像是:

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
Run Code Online (Sandbox Code Playgroud)

然后你的地图包含如下行:

DN_OF_USER1 12
DN_OF_USER2 34
DN_OF_USER3 56
Run Code Online (Sandbox Code Playgroud)

如果 DN 包含空格,您将必须使用外部程序来执行地图而不是纯文本文件(它可能适用于其他地图类型,但我自己没有尝试过)。