好吧,我花了一整天时间在这上面——
我正在使用带有 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 可能是一个答案。它可以重写/添加/替换/修补解密内容中的任何内容。