如何在一台虚拟服务器上使用ssl_verify_client = ON并在另一台虚拟服务器上使用ssl_verify_client = OFF?


9

我想强制对我的虚拟主机进行ssl客户端验证。但是出现“未发送必需的SSL证书”错误,试图从中获取某些信息。

这是我的测试配置:

# defaults                                                                                                                                                                    
ssl_certificate /etc/certs/server.cer;                                                                                                                                 
ssl_certificate_key /etc/certs/privkey-server.pem;                                                                                                                     
ssl_client_certificate /etc/certs/allcas.pem;                                                                                                                                 

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server1.example.com;                                                                                                                                          
    root /tmp/root/server1;                                                                                                                                                   

    ssl_verify_client off;                                                                                                                                                    
}                                                                                                                                                                             

server {                                                                                                                                                                      
    listen 1443 ssl;                                                                                                                                                          
    server_name server2.example.com;                                                                                                                                          
    root /tmp/root/server2;                                                                                                                                                   

    ssl_verify_client on;                                                                                                                                                     
} 

第一台服务器回复200个http代码,但第二台服务器返回“ 400 Bad Request,未发送所需的SSL证书,nginx / 1.0.4”。

可能在同一IP上使用ssl_verify_client是不可能的吗?我应该将这些服务器绑定到不同的IP,这可以解决我的问题吗?

Answers:


4

我遇到了类似的问题,但希望区分ssl_verify_clients服务器块中的位置块之间,而不是服务器块之间。您可以通过将默认的ssl config内容移动到两台服务器中来解决您的问题(肯定地将其复制或将它们全部放在一个服务器块中,接受多个子域并使用位置)。

对于基于位置的解决方案,看起来像以下作品。采用

ssl_verify_client optional;

在服务器块中,并在各个位置使用if语句,例如:

if ($ssl_client_verify != SUCCESS) { return 403; }

我需要执行此操作,以授予管理员对Web应用程序的访问权限,但仍然允许从github上进行webhooks,而无需给github提供客户端ssl证书。


2

如果要在同一IP地址和端口上具有多个基于名称的虚拟主机(使用SNI),但ssl_verify_client这些主机具有不同的设置,则至少需要升级到nginx> = 1.0.9 。

在较旧的nginx版本ssl_verify_client中,默认虚拟主机的设置用于同一IP +端口组合上的所有其他基于名称的虚拟主机。其他一些SSL选项(ssl_verify_depthssl_prefer_server_ciphers)也以相同的方式处理。如果您绝对不能升级,则使用单独的IP或端口可能是一种解决方法。

注意从1.0.9 的nginx 更改日志

*) Bugfix: the "ssl_verify_client", "ssl_verify_depth", and
   "ssl_prefer_server_ciphers" directives might work incorrectly if SNI
   was used.

Nginx源中的相关更改: 中继中的r4034,1.0分支中的r4246


0

您是否在浏览器中加载了由CA“ /etc/certs/allcas.pem”签名的客户端证书(采用PKCS12格式)?在Firefox中,您可以通过进入“首选项”->“高级”->“加密”->“查看证书”->“您的证书”来检查客户端证书。

默认情况下,如果为“ off”,则参数“ ssl_verify_client”的值。如果不是必须的SSL客户端证书,则也可以使用值“可选”。


我用curl --cert ...具有相同的结果。
2011年

Nginx的错误日志中有什么有趣的东西吗?(可能/var/log/nginx/error.log)
user1025596

0

我不是nginx专家,但是使用SSL和虚拟主机的apache也遇到了类似的问题。问题在于服务器处理SSL协商的顺序与选择虚拟主机的顺序。第一步是建立加密的连接,只有这样做之后,服务器才能看到您要求的主机名。直到知道为止,它将使用默认设置-在这种情况下,它是第一台主机,它需要客户端证书才能建立SSL连接。

因此,简短的回答-在这种情况下,最好是使用单独的端口或单独的IP地址。


-1

我遇到了同样的问题,并找到了解决方案。

请尝试default_server为第二台服务器添加标志

listen 443 ssl default_server;
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.