我让 Nginx 纯粹作为各种 Web 服务器的代理运行。我们的一位客户要求我们使用客户端证书,并为 3 台不同的机器提供了 3 个证书,这些机器将连接到在其中一台代理服务器上运行的 Web 服务。
在我找到相关的 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 [info] 27601#0: *1963 客户端在处理 SPDY 时未发送所需的 SSL 证书,客户端:1x.xx.xx.xx,服务器:service.domain.com,请求:“ GET /test.cfm HTTP/1.1”,主机:“service.domain.com”
正如您从上面的配置中看到的那样,我没有启用 SPDY(但我在其他站点上启用了),并且客户端确保我他们正在发送客户端证书。因为这是我第一次这样做,所以我想确保在我回去说我的日志说你没有发送客户端证书之前,我已经把一切都搞定了。
关于发送给我的证书:所有 3 个证书均由同一个公共证书颁发机构签名。但是,我没有连接文件中的整个链。我在网上找到的指南也提到了具有根 ca,但他们都在谈论自签名,而这些都不是。所以我不确定这是否适用。
为了澄清,我也没有尝试将客户端证书传递给代理服务器。
nginx 版本:nginx/1.8.0
openssl 版本:OpenSSL 1.0.1k 2015 年 1 月 8 日
如果需要更多信息,请告诉我
您的配置实际上是正确的。但是,请确保您没有将实际的客户端证书放入
client_package.cer
文件中。这个文件应该只包含受信任的 CA 证书,实际上它应该包含完整的链。如果您的客户没有提供所有根证书和中间证书,您应该向他们索取所有的根证书和中间证书。与默认服务器设置相关的问题也很少。请阅读并确保它不会影响您。
使用
ssl_trusted_certificate
指令而不是ssl_client_certificate
. 请参阅文档http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate。但无论如何,我建议使用一个根 CA签署所有客户端证书,并验证客户端证书是否使用该 CA 签署。
如果它解决了您的问题,请接受它作为答案。
SSL证书是通配符还是单域?也许开发人员试图访问网站 url,例如 test.myapp.com,但证书仅针对 myapp.com 或 www.myapp.com 颁发