如何使用 nginx 前端验证 ssl 客户端证书?

如何使用 nginx 前端验证 ssl 客户端证书?

我有一些 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 前面……它们中的任何一个都应该能够完成提供网页的整个工作。

相关内容