NGINX - 反向代理证书认证

4
我正在尝试使用nginx作为反向代理到运行Tomcat的内部Web服务器,该服务器托管我们ERP系统的前端。它已经很好地工作了:我可以完美地连接到nginx服务器(它被锁定在我们的网络上,不同的VLAN、防火墙等等),然后反向代理到我的ERP服务器。
但是,我想增加一层额外的保护,要求用户在计算机上拥有数字证书,以便访问第一个(nginx)服务器。该证书对于后端服务器不使用/必需。
我已经阅读了这个教程http://nategood.com/client-side-certificate-authentication-in-ngi,它允许我生成自签名证书和其他所有内容。
当在nginx配置中使用ssl_verify_client optional时,我可以正常连接到我的后端服务器,但不需要任何证书。
当我将其切换到ssl_verify_client on时,所有访问都被阻止。
400 Bad Request

No required SSL certificate was sent

无论我使用哪种浏览器(Chrome、IE、Edge、Firefox),都没有要求我使用证书/链。当然,我已经将所有证书/链放在了客户端计算机上。那么,我缺少什么呢?
以下是我的完整的nginx配置:
server {
        listen 443;
        ssl on;
        server_name 103vportal;

        ssl_password_file /etc/nginx/certs/senha.txt;
        ssl_certificate      /etc/nginx/certs/server.crt;
        ssl_certificate_key  /etc/nginx/certs/server.key;
        ssl_client_certificate /etc/nginx/certs/ca.crt;
        ssl_verify_client on;


        location / {
                proxy_pass http://10.3.0.244:16030;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";

                proxy_read_timeout 300;
                proxy_send_timeout 300;
        }

}

您的客户端证书由 ca.crt 签名,并在浏览器的 个人证书 下列出?并且自重新配置服务器以来,您已经清除了浏览器缓存吗? - Richard Smith
@RichardSmith 嗨,谢谢你的帮助。是的,根据教程,它是由ca.crt签名的。然而,很奇怪的是,即使强制(Internet Explorer证书),它也没有列在个人证书下面,而是列在中间机构下面。我也注意到了这一点,但是我完全按照教程操作,因为这是我第一次实施这个操作。也许证书不是"客户端/个人"的?有没有办法通过 OpenSSL 生成它? - Luiz Carlos
我创建了一个带有密码的PKCS#12文件,以便将私钥和签名证书添加到浏览器个人证书列表中。中间证书存储对您无效。 - Richard Smith
你知道生成它的命令吗? - Luiz Carlos
1个回答

1
假设您已经为用户生成了私钥和证书请求,并使用客户端 CA 进行了签名。您需要将私钥和签名证书放入浏览器的个人证书列表中。
我发现最好的方法是创建一个受密码保护的 PKCS#12 文件(因为某些浏览器要求密码保护)。我使用以下 OpenSSL 命令:
cat user.key user.crt | openssl pkcs12 -export -out user.p12

尊敬的先生,感谢您迄今为止的帮助。我已删除所有证书并重新执行了所有操作(按照相同的教程),并使用了您的命令,它确实生成了用户证书。我能够在Internet Explorer中导入它到个人证书下。整个证书链似乎都是有效的,但是我仍然收到相同的400错误请求,并且没有弹出窗口要求我选择证书或类似的东西。在Nginx日志中,我可以看到这个(与之前相同):“[info] 1396#0:*13客户端在读取客户端请求标头时未发送所需的SSL证书,“ - Luiz Carlos
IE信任您的服务器证书还是签署您服务器证书的CA?一些浏览器不会与它们不信任的站点交换个人证书(不确定IE是否也是如此)。 - Richard Smith
是的,我已经手动将CA放置在受信任的根证书下。 - Luiz Carlos
我设法搞定了。我重新创建了所有证书(如果我没记错的话,已经是第五次了),这一次,我使用了我的内部主机名(在这种情况下是"103vportal")。然后,我手动在服务器上创建了一个DNS记录来指向该主机名。将所有内容整合在一起(包括用你的命令创建的证书),在浏览器中运行,这次IE和Chrome弹出了一个窗口供我选择证书。并且成功了。所以显然问题出在主机名/证书组合上。既然对我有效,我就不再折腾了,但以后我会尝试再次使用我的名字进行创建。谢谢。 - Luiz Carlos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接