我处于一个奇怪的场景中,我有一个带有 NodeJS 后端和 ReactJS 前端的服务器,它会保存记录,客户希望使用用户证书来识别访问此内部站点的人员。问题是他们有一个非常大的网络,带有复杂的 PKI,而且我分配给该站点的公共证书不一定与所有可以访问它的客户端相匹配。
我在前面设置了 nginx,ssl_verify_client optional_no_ca;
但我注意到,如果用户拥有由与 nginx 提供的公钥相同的 CA 正确签名的证书,浏览器只会为用户提供选择客户端证书的选项。
我的理解是,在证书请求期间,服务器可以指定哪些 CA 是可接受的。看起来nginx 可能正在这样做,但我不确定情况是否如此。我的计划是明天开始用wireshark进行剖析。有没有一种已知的方法可以让我的网站要求浏览器始终提示用户输入客户端证书?我是否一路上误解了什么?
简单:将您希望 nginx 请求的权限证书放入您的 nginx 配置中。Nginx 将根据您的
ssl_verify_client
设置发送并验证这些内容。就是这样‡。通过证书进行身份验证的两个方向是不相关的。您的服务器确实提供了证书,并且没有规则说不能有任何重叠,但除此之外,您可以要求您想要的任何权限。Nginx 甚至不发送您配置为使用
ssl_client_certificate
. 它发送可接受的签名算法的列表,以及这些证书的可分辨名称集的列表:类似于/C=DK/O=ACME Inc./CN=ACME CA3
.如果您必须支持较旧的(TLSv1.3 之前的)客户端以及混合签名算法(EC 和 RSA 之间的混合),并且您的专有名称列表变得过大,则可能会遇到互操作性问题。尝试可行的方法,特别是使用您需要支持的软件,并确保错误消息要么是不言自明的,要么是为客户或业务合作伙伴可能遇到的任何错误消息正确记录的。
‡) 这就是让完全支持 TLSv1.3 的客户端提供签名证书的过程。那么你还没有完成。请不要相信任何非由您管理的 CA 签署的所有内容都是证书所暗示的授权用户,并确保在实际处理那些可选提供的 nginx 代理后面的应用程序中进行非常严格的验证,可能是毫无价值/不相关的证书。