![对于客户端身份验证,为什么客户端可以通过属于另一个客户端的 openssl 证书访问站点?](https://linux22.com/image/750380/%E5%AF%B9%E4%BA%8E%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%E5%B1%9E%E4%BA%8E%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%20openssl%20%E8%AF%81%E4%B9%A6%E8%AE%BF%E9%97%AE%E7%AB%99%E7%82%B9%EF%BC%9F.png)
为了测试双向身份验证,我通过 openssl 创建了一个 CA 证书。然后我为两个站点(“a.com”和“b.com”)创建了两个证书作为服务器端证书。我还创建了两个客户端证书(客户端“a”和客户端“b”)。所有这些证书均由同一 CA 签名。
在客户端,每个客户端证书用于访问相应的站点。换句话说,要访问站点“a.com”,需要属于客户端“a”的证书,或者客户端“a”必须经过身份验证。客户端“b”访问站点“b.com”的情况相同。
在实验中,我仅将属于客户端“a”的证书导入浏览器。通过选择相关证书,打开了网站“a.com”。但是当我尝试打开“b.com”时,显示了属于客户端“a”的证书,通过选择它,我可以访问“b.com”。请注意,仅导入了证书“a”。
(另请注意,客户端证书也包含 CA 证书。)
这个问题的原因是什么??
答案1
这不是问题 - 这是设计使然。通过在网站“A”和“B”上安装单个 CA 证书,您可以指示它们信任该 CA 颁发的任何客户端证书。
使其按预期工作的一种方法是拥有两个不同的 CA - 一个用于“A”服务器和客户端,另一个用于“B”服务器和客户端。
或者,Apache Web 服务器也许能够帮助你,因为它具有SSLRequire
或者Require
指令可以过滤特定表达式的客户端证书。您可以确保网站“A”的所有用户都拥有带有特定字符串的 OU 的证书,而网站“B”的用户拥有不同的字符串,并根据这些进行过滤。如果您已经实施了证书策略 OID,则可以根据证书策略 OID 进行过滤。
Nginx 有嵌入变量其中包含客户端证书的详细信息,您可以使用它们进行过滤。