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