Nginx 客户端 SSL 身份验证

Nginx 客户端 SSL 身份验证

我让 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 颁发

相关内容