我有一些 URL,我想使用 Apache 配置中的如下指令,通过 SSL 客户端证书来保护它们:
SSLVerifyClient require
SSLVerifyDepth 10
SSLRequireSSL
SSLOptions +StrictRequire
SSLRequire %{REMOTE_ADDR} =~ m/^127\.0\.0\.1$/ \
or ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
and %{SSL_CLIENT_I_DN_CN} eq "xxx" \
and %{SSL_CLIENT_S_DN_Email} in {"[email protected]", "[email protected]",} )
似乎没有任何 nginx 指令来处理这个问题,所以我认为我必须将所有内容传递给 Apache 后端。
这让我想到了我的问题,如何传递加密的 SSL?所有代理都在 nginx 级别解密 SSL 数据包,然后将其传递给 Apache。
答案1
如果您希望 Apache 处理 SSL 验证,那么您需要将其放在 nginx 前面,或者通过自定义标头等将客户端 DN 传递给 Apache 做一些疯狂的事情——这项工作非常艰巨。
有一些不过,nginx 中存在用于进行 DN 检查的工具;Nginx HTTP SSL 模块文档给出可能的变量(一直到最底部,不幸的是标记已经塞满了,所以没有标题),但$ssl_client_s_dn
应该是你要找的,if $ssl_client_s_dn ~= CN=something_or_other
如果你不喜欢所呈现的证书,你可以使用 nginx 的类似编程的指令(类似的东西)来重定向或返回 403。它与你习惯的 Apache 非常不同,但最终 Apache 做这种事情的方式也不是油画,所以这完全取决于你喜欢哪种丑陋...
不过,我很好奇,为什么你要把 nginx 放在 Apache 前面……它们中的任何一个都应该能够完成提供网页的整个工作。