即使客户端证书不是由与服务器证书相同的 CA 签名的,是否可以让浏览器出示客户端证书?

即使客户端证书不是由与服务器证书相同的 CA 签名的,是否可以让浏览器出示客户端证书?

我处于一个奇怪的场景中,我有一台带有 NodeJS 后端和 ReactJS 前端的服务器,该服务器负责记录保存,客户希望使用用户证书来识别访问此内部站点的人。问题是他们的网络非常庞大,PKI 错综复杂,而我分配给该站点的公共证书不一定与可以访问它的所有客户端匹配。

我已经在前面设置了 nginx ssl_verify_client optional_no_ca;,但我注意到,只有当用户拥有由与​​ nginx 提供的公钥相同的 CA 正确签名的证书时,浏览器才会为用户提供选择其客户端证书的选项。

我的理解是,在证书请求期间,服务器可以指定哪些 CA 是可接受的。它似乎比如 nginx 可能正在这样做,但我不确定是否如此。我的计划是明天开始使用 wireshark 进行分析。有没有已知的方法可以让我的网站要求浏览器始终提示用户输入客户端证书?我是不是误解了什么?

答案1

简单:将你授权的证书放入你的 nginx 配置中想要 nginx 请求。Nginx 将根据您的ssl_verify_client设置发送并验证这些内容。就是这样

ssl_client_certificate = /path/to/concatenated-x509.pem
# contents of /path/to/concatenated-x509.pem may contains, possibly many:
# -----BEGIN CERTIFICATE---- much foo bar -----END CERTIFICATE-----

通过证书进行身份验证的两个方向是无关的。您的服务器确实提供了证书,并且没有规则说不能不会有任何重叠,但除此之外,您可以要求任何您想要的权限。Nginx 甚至不会发送您配置为使用 发送的证书的公钥ssl_client_certificate。它发送可接受的签名算法列表,以及专有名称这些证书的集合:类似于/C=DK/O=ACME Inc./CN=ACME CA3

编辑:注意其他答案- 不特别请求任何 CA 也是一个选择。

如果您必须支持较旧的(TLSv1.3 之前的)客户端以及混合签名算法(EC 和 RSA 混合),并且您的可分辨名称列表变得过大,则可能会遇到互操作性问题。尝试什么方法有效,特别是使用您需要支持的软件,并确保错误消息是不言自明的或正确记录的,以便客户或业务合作伙伴可能遇到它们。


‡) 这就是获得完全支持 TLSv1.3 的客户端的方法展示签署的证书由您列表中的任何 CA。那么你还没完成。请很少相信由任何非您管理的 CA 签名的所有内容都是证书所暗示的授权用户,并确保非常严格在你的应用程序中的 nginx 代理后面进行验证,实际上处理这些可选呈现,可能毫无价值/不相关证书。

答案2

我要真诚地感谢@anx 的回答,因为它确实让我走上了正确的道路,但它似乎不正确。

anx 正确地指出了我到文档

文档中这样说道ssl_client_certificate

如果启用了 ssl_stapling,则指定一个包含 PEM 格式的受信任 CA 证书的文件,用于验证客户端证书和 OCSP 响应。证书列表将发送给客户端。如果不希望这样,可以使用 ssl_trusted_certificate 指令。

我们没有收到提示的原因是 nginx 正在向浏览器发送 CA 证书列表,浏览器会查看该列表。如果浏览器发现它没有与该 CA 匹配的客户端证书(带有私钥),则将不会显示提示。

然而正如文档所说ssl_trusted_certificate才不是发送列表。

如果启用了 ssl_stapling,则指定一个包含 PEM 格式的受信任 CA 证书的文件,用于验证客户端证书和 OCSP 响应。与 ssl_client_certificate 设置的证书不同,这些证书的列表不会发送给客户端。

我刚刚完成了两种方式的测试;ssl_client_certificate导致缺少匹配证书的浏览器不提示,而ssl_trusted_certificate这正是我们想要的;它不会发送 CA 证书列表,并且总是提示。

对于需要测试此问题的其他用户,请注意可用性,您必须关闭并重新打开浏览器才能显示提示。刷新页面是不够的。

相关内容