对于客户端身份验证,为什么客户端可以通过属于另一个客户端的 openssl 证书访问站点?

对于客户端身份验证,为什么客户端可以通过属于另一个客户端的 openssl 证书访问站点?

为了测试双向身份验证,我通过 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 有嵌入变量其中包含客户端证书的详细信息,您可以使用它们进行过滤。

相关内容