Nginx 客户端 SSL 认证

Dri*_*104 9 nginx ssl-certificate

我让 Nginx 纯粹作为各种网络服务器的代理运行。我们的一位客户要求我们使用客户端证书,并为 3 台不同的机器提供了 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;
Run Code Online (Sandbox Code Playgroud)

我将 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 日

如果需要更多信息,请告诉我

dto*_*lis 2

你的配置实际上是正确的。但是,请确保您没有将实际的客户端证书放入client_package.cer文件中。该文件应该只包含受信任的 CA 证书,实际上它应该包含完整的链。如果客户未提供所有根证书和中间证书,您应该向他们请求。

还有一些与默认服务器设置相关的问题。请阅读本文并确保它不会影响您。