我让 Nginx 纯粹作为各种 Web 服务器的代理运行。我们的一位客户要求我们使用客户端证书,并为我们提供了 3 个证书,用于连接到代理服务器之一上运行的 Web 服务的 3 台不同机器。
之前从来没有这样做过,我找到了相关的 nginx 设置并创建了一个站点配置(相关部分如下)
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 个客户端证书加上开发人员创建的证书(该证书是自签名的)连接到上面提到的单个文件中,该开发人员需要在开发期间访问该站点。
客户现在尝试访问该网站,但无法访问。作为配置测试,我从串联证书文件中删除了开发人员证书,并确认他无法访问该网站。一旦我将他的证书重新添加到串联文件中,他(开发人员)就可以再次正确访问该网站。
我在错误日志上打开了调试级别访问,当客户端尝试连接时出现以下错误。
2015/08/13 11:57:41 [信息] 27601#0:*1963 客户端在处理 SPDY 时未发送所需的 SSL 证书,客户端:1x.xx.xx.xx,服务器:service.domain.com,请求:“GET /test.cfm HTTP/1.1”,主机:“service.domain.com”
从上面的配置中可以看出,我没有启用 SPDY(但我在其他网站上启用了),客户端向我保证他们正在发送客户端证书。由于这是我第一次这样做,我想确保在我返回并说我的日志说您没有发送客户端证书之前,我在这方面已经做对了。
关于发给我的证书:所有 3 个证书均由同一公共证书颁发机构签名。但是,我没有整个链的连接文件。我在网上找到的指南也提到有根证书颁发机构,但它们都谈论的是自签名证书,而这些都不是。所以我不确定这是否适用。
为了澄清起见,我也没有尝试将客户端证书传递给代理服务器。
nginx 版本:nginx/1.8.0
openssl 版本:OpenSSL 1.0.1k 2015 年 1 月 8 日
如果需要更多信息,请告诉我
答案1
您的配置实际上是正确的。但是,请确保您不要将实际的客户端证书放入client_package.cer
文件中。此文件应仅包含受信任的 CA 证书,实际上它应包含完整的证书链。如果客户端未提供所有根证书和中间证书,则应向客户端请求它们。
默认服务器设置也存在一些问题。请读这个并确保它不会影响您。
答案2
使用ssl_trusted_certificate
指令代替ssl_client_certificate
。请参阅文档http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate。
但无论如何,我建议使用以下方式签署所有客户端证书一个根 CA并验证客户端证书是否由该 CA 签名。
如果它解决了您的问题,请接受它作为答案。
答案3
Ssl 证书是通配符还是单域名?也许开发人员试图访问网站网址,例如 test.myapp.com,但证书仅针对 myapp.com 或 www.myapp.com 颁发