问题:
我们这里有一个使用客户端证书身份验证的应用程序。多年来,这一直没有任何问题,但现在有几个客户端在 FF 和 Chrome 中遇到以下问题,但在 IE 中(还没有):“选择客户端证书”对话框不再出现,因此它们被重定向到用户名/密码登录页面。所以我假设,浏览器不会将安装的客户端证书识别为适合服务器发送的 CA 名称。
我检查了什么:
- 没有证书(服务器或客户端)已过期。
- nginx 正在向客户端发送正确的 CA 名称。我检查了使用 openssl s_client ....
- 我已阅读 FF 更改日志以找到任何听起来与客户端证书相关的内容,但到目前为止还没有任何内容可以解释此问题
我试过的:
- 我从 nginx 配置中删除了“ssl_client_certificate”和“ssl_verify_depth”,浏览器中的选择客户端对话框再次出现,只是这次显示了所有已安装的证书,包括我们应用程序的证书。选择正确的证书后,登录成功,应用程序正常运行。
这使我得出结论,发送给客户端的 CA 名称可能是错误的,而证书本身是可以的。 - 正如我之前提到的,并非所有客户端都遇到此问题,因此我在测试机器上安装了来自工作客户端的客户端证书和来自非工作客户端的客户端证书。我应该注意,这两个证书都是由同一个 CA 颁发的(工作证书只是几个月前)。猜猜看:当我尝试访问应用程序时,会出现“选择证书”对话框,但它只显示一个证书(来自工作客户端的证书)。如果我再次从 nginx 配置中删除“ssl_client_certificate”指令,我可以选择(并成功登录)这两个证书中的任何一个。这与 (1.) 相比,其中一个证书似乎存在问题
现在我能做的就是引用萨姆纳-米勒先生的话:“为什么会这样?”
我希望,以前有人遇到过类似的问题,因为我唯一的其他选择是深入研究 FF 的源代码,看看如何构建合适的客户端证书列表。该客户端证书对话框的行为最近必须更改,所以我接下来要做的是在我的测试机器上降级 FF,直到它再次工作。
环境:
服务器:centOS 7,nginx 1.19.0,openssl 1.1.1f
客户端:Ubuntu 19.10 上的 Firefox 77、Chrome 83 和多个版本的 Windows
nginx配置:
ssl_verify_client optional_no_ca;
ssl_client_certificate /etc/ssl/certs/waf_client_ca.pem;
ssl_verify_depth 2;
笔记:
- 之所以存在“optional_no_ca”,是因为出于“历史原因”,客户端证书的验证是在 nginx 之外处理的。如果我将其设置为“是”或“可选”,浏览器行为不会改变。
- 如果我必须更换所有这些证书,那将是非常糟糕的,所以是的:我已经考虑过建立一个全新的 CA 并为所有客户颁发新证书,但是有成千上万的证书,所以我真的尽量避免这种情况。至少在我确切地知道至少一些现有的有什么问题之前。