如何从现有的 SSL 环境变量创建自定义标头?

如何从现有的 SSL 环境变量创建自定义标头?

好吧,我花了一整天时间在这上面——

我正在使用带有 mod_ssl 的 apache,我试图获取一个现有的环境标头“%{SSL_CLIENT_S_DN_CN}s”,它看起来像“Lastname Firstname Mi username”,并设置一个名为 USERNAME 的新标头,并将其设置为仅等于用户名(最后一个空格和字符串末尾之间的字符)

然后我会将该标头反向代理到后端主机,后端主机将使用它来识别用户。

我尝试了很多不同的方法。我不知道问题是否在于我不理解 perl 正则表达式,或者我不理解语法,或者我没有将其放在正确的位置,或者三者兼而有之。

下面是我尝试过的一个例子:

SetEnvIf SSL_CLIENT_S_DN_CN (.*\ )(.*) newhostname=$2
RequestHeader set HOSTNAME "%{newhostname}e"

我真正想要的是一个与 DN_CN 环境变量中的最后一个非空白字符相等的新标题主机名。

答案1

好的 - 我在周中弄清楚了这一点,但仍然想给某人一个获得赏金的机会。

令人惊讶的是,这在任何地方都没有很好的记录,但是当我使用 mod_headers 来执行此操作时,您可以找到该文档这里

你想做什么设置标题,无论您是从 ssl 还是从环境中获取它。 然后你可以编辑标题使用正则表达式和捕获组。

一些例子:

  RequestHeader 设置 REMOTE_USER "%{SSL_CLIENT_S_DN_CN}s"
  RequestHeader 编辑 REMOTE_USER (.*\s)(.*) $2
  RequestHeader 设置 AUTHENTICATE_CN "%{SSL_CLIENT_S_DN_CN}s"
  RequestHeader 编辑 AUTHENTICATE_CN (.*\s)(.*) $1
  RequestHeader 设置 AUTHENTICATE_MAIL "%{SSL_CLIENT_S_DN_CN}s"
  RequestHeader 编辑 AUTHENTICATE_MAIL (.*\s)(.*)[电子邮件保护] 

答案2

我会用AuthBasicFake 指令这将设置标题,然后你可以执行代理通行证在相同的位置区块。它看起来是这样的:
<Location "/blah">
AuthBasicFake %{SSL_CLIENT_S_DN_CN}
ProxyPass http://example.org/blah
</Location>

如果主题中有一些其他 x509 属性(例如用户名本身),则可以使用 SSL_CLIENT_S_DN_uid 或 SSL_CLIENT_S_DN_email。

答案3

从未使用 SSL 做过这件事(我在这里真的不太明白),但 mod_security 可能是一个答案。它可以重写/添加/替换/修补解密内容中的任何内容。

相关内容