根据客户端证书设置标头

根据客户端证书设置标头

我有 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 包含空格,您将必须使用外部程序来执行映射,而不是纯文本文件(它可能适用于其他映射类型,但我自己没有尝试过)。

相关内容