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

我想强制我的虚拟主机的SSL客户端validation。 但是得到“没有必要的SSL证书发送”的错误,试图从中获得一些东西。

这里是我的testingconfiguration:

# 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错误请求,没有发送必需的SSL证书,nginx / 1.0.4”。

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

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

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

来自nginx更新日志 1.0.9的注意事项:

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

nginx源代码中的相关更改:trunk中的r4034,1.0分支中的r4246 。

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

对于基于位置的解决scheme,看起来像下面的工作。 使用

ssl_verify_client optional;

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

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

我需要这样做给pipe理员访问一个webapp,但仍然允许从github的webhook没有给github一个客户端SSL证书。

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

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

我不是一个nginx专家,但是我已经看到了与使用SSL和虚拟主机的Apache类似的问题。 问题是服务器处理SSL协商的顺序与虚拟主机的select。 第一步是build立encryption连接,只有在完成之后,服务器才能看到你要求的主机名。 直到它知道,它将使用默认设置 – 在这种情况下,它是第一个主机,它需要客户端证书才能build立SSL连接。

所以,简短的回答 – 在这种情况下,你最好有独立的端口或单独的IP地址。

我遇到了同样的问题,并find了解决办法。

请尝试添加第二个服务器的default_server标志

 listen 443 ssl default_server;