如何使用Nginx前端对SSL客户端证书进行身份验证?


3

我有一些URL,我喜欢使用apache configs中的以下指令通过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 {"xx@xx.com", "xx@xx.com",} )

似乎没有任何Nginx指令来处理此问题,因此我假设我必须将所有内容都传递给Apache后端。

这给我带来了一个问题,如何通过加密的SSL?在将它们传递给Apache之前,所有代理都在nginx级别解密ssl数据包。


您应该问一个有关如何使用Nginx进行操作的问题。降级回Apache并不是解决方案。使用Django(您在另一条评论中提到过mod_wsgi)可以在Nginx中轻松完成。我在许多网站上都这样做。研究uwsgi和Nginx。如果您发现Apache速度更快,则说明您的配置错误。问那些问题。
David Betz

Answers:


2

如果您希望Apache处理SSL验证,则需要将其放在nginx前面,或者通过自定义标头或其他方式将客户端DN传递给Apache来做一些疯狂的事情-大量的工作。

不过,在nginx中有一些用于进行DN检查的工具;在Nginx的HTTP SSL模块文档给可能的变量(右向下探底,而不幸的是,标记的毛绒所以没有标题的话),但$ssl_client_s_dn应该是你要找的内容,并且可以使用nginx的的编程类指令(if $ssl_client_s_dn ~= CN=something_or_other样事物)重定向或返回403(如果您不喜欢所提供的证书)。这与您对Apache的习惯有很大的不同,但是最终Apache的处理方式也不是油画,所以这完全取决于您喜欢哪种丑陋的东西...

不过,我很好奇,为什么要将Nginx放在Apache的前面……它们中的任何一个都应该能够完成提供网页的整个工作。


好的,我来研究一下指令。我在Apache前面运行nginx,因为我需要多个“所有ssl”虚拟主机,而SNI似乎很粗略。我仍然需要Apache,主要是因为Django应用程序的mod_wsgi以及RoR和php-fpm的乘客。在需要多个SSL站点之前,我已经对Apache进行了调优,因此不会发生其他变化。事实证明,nginx将我的ssl页面加载减少了大约.3秒左右,并且在静态文件上很棒,因此是一个很大的变化。
范·盖尔

好的,使用与您指向的方向非常接近的方法进行工作。
范·盖尔

您答案中的链接已断开,它似乎是正确的位置nginx.org/en/docs/http/ngx_http_ssl_module.html#variables。另外,fastcgi_param DN $ssl_client_s_dn如果您使用fastcgi,则可以将这些变量传递给您的解释器;如果您使用proxy_pass,则可以定义任意标头,例如proxy_set_header nginx-ssl-client-dn $ssl_client_s_dn,让上游服务器对那些标头起作用(例如,Apache上游服务器后面的PHP)会将其公开为 $_SERVER['NGINX_SSL_CLIENT_DN']
Doktor J
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.