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

Ale*_*nko 11 ssl nginx web

我想强制对我的虚拟主机进行 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;                                                                                                                                                     
} 
Run Code Online (Sandbox Code Playgroud)

第一个服务器回复 200 http 代码,但第二个服务器返回“400 Bad Request, No required SSL certificate was sent, nginx/1.0.4”。

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

小智 6

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

对于基于位置的解决方案,如下所示。用

ssl_verify_client optional;

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

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

我需要这样做以授予管理员访问 web 应用程序的权限,但仍然允许来自 github 的 webhooks 而无需为 github 提供客户端 ssl 证书。


小智 0

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

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