我有Nginx纯粹作为一个代理服务器的各种数量的Web服务器运行。 我们的一个客户要求我们使用客户端证书,并为3台不同的机器提供了3个证书,这些机器将连接到一台代理服务器上运行的web服务。
从未这样做,我find了相关的nginx设置,并创build了一个站点configuration(下面的相关部分)
server { listen 443 ssl; server_name service.domain.com; ssl_certificate /etc/nginx/ssl/wildcard/server.crt; ssl_certificate_key /etc/nginx/ssl/wildcard/server.key; ssl_client_certificate /etc/nginx/ssl/client.certificates/client_package.cer; ssl_verify_client on;
我将3个客户端证书和由开发者创build的证书(这个是自签名的)在开发过程中连接到上面提到的单个文件。
客户现在试图访问该网站,但无法这样做。 作为configurationtesting,我从连接的证书文件中删除了开发人员证书,并确认他无法访问该网站。 一旦我将他的证书添加到连接文件中,他(开发人员)就可以再次正确访问网站。
我打开了错误日志的debugging级别访问,当客户端试图连接时,我得到了以下错误。
2015/08/13 11:57:41 [info] 27601#0:* 1963客户端在处理SPDY时没有发送所需的SSL证书,客户端:1x.xx.xx.xx,服务器:service.domain.com,请求:“ GET /test.cfm HTTP / 1.1“,主机:”service.domain.com“
从上面的configuration中可以看到,我没有启用SPDY(但我在其他站点上),客户端确保他们发送客户端证书。 因为这是我第一次这样做,所以我想确保在我回去之前说我的日志说你没有发送客户端证书,我已经把所有的东西都修改了。
关于发给我的证书:所有3个都由同一个公共证书机构签字。 然而,我并没有在连接的文件中有整个链。 我在网上发现了哪些指南,其中也提到了根CA,但是他们都在谈论自签名,而这些都不是。 所以我不确定这是否适用。
为了澄清,我也没有试图将客户端证书传递给代理服务器。
nginx版本:nginx / 1.8.0
openssl版本:OpenSSL 1.0.1k 2015年1月8日
如果有任何更多的信息,请让我知道
你的configuration实际上是正确的。 但是,请确保您不要将实际的客户端证书放入client_package.cer文件中。 这个文件应该只包含可信的CA证书,实际上它应该包含完整的链。 如果客户没有提供根证书和中间证书,则应该向客户请求所有根证书和中间证书。
还有一些与默认服务器设置有关的问题。 请阅读并确保它不会影响你。
使用ssl_trusted_certificate指令而不是ssl_client_certificate 。 请参阅文档http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate 。
但无论如何,我会build议使用一个根CA来签署所有客户端证书,并validation客户端证书是否与该CA签署。
如果它解决了你的问题,请接受它作为答案。
Ssl证书是通配符还是单个域? 也许开发者ia尝试访问网站的url,例如test.myapp.com,但证书仅针对myapp.com或www.myapp.com