我们应该比较 Mutual TLS 中的指纹吗?

Should we compare thumbprints in Mutual TLS?

在使用 https://docs.microsoft.com/en-us/aspnet/core/security/authentication/certauth?view=aspnetcore-5.0 实现双向 TLS 时,我看到他们正在将客户端证书的指纹与服务器证书的指纹进行比较。但是这些在生产中总是保证相同吗?不是一个只包含 public 密钥而另一个包含私钥和 public 密钥吗?如果是这样的话,他们不会有不同的指纹吗?

我找到了你的观点,这里是答案,前一段

Because the same self-signed certificate is used in this example, ensure that only your certificate can be used.

出于某种原因,他们选择对服务器和客户端使用相同的证书(也许是为了简单?)这确实是现实世界中的 *BAD* 做法。在不同实体之间共享相同的证书从来都不是一个好主意。客户端和服务器证书必须不同。

基于证书的客户端身份验证更加困难,因为您需要有一个帐户目录来验证客户端证书。例如,活动目录。该目录应实现 certificate <-> principal 映射。当您收到证书时,您在目录中搜索主体,如果找到,您可以唯一区分客户端,验证他们的权限,权利并执行日志记录。

如果未找到映射 -- 拒绝身份验证,因为您不了解客户端。

如果您不关心区分客户端,那么您显然不需要相互身份验证。

并且永远不要在代码中使用硬核客户端 certificates/thumbprints,因为它们会定期更改,因此需要外部帐户目录(使用带外进程更新)。

不过,当任意客户端只有在拥有您的私有 CA 颁发的证书时才能连接到您的服务器时,您可以实现逻辑。这是有效的场景。在这种情况下,您不需要外部帐户目录,并且验证客户端证书是由确切的或列表中的预定义 CA 之一颁发的,然后您允许后续通信。但它们对您的系统仍然是匿名的。

根据您的添加进行编辑:

如果您的情况符合最后一段,那么:

  • 验证通用链(即时间有效性、扩展、撤销等)
  • 验证直接颁发者是否在您批准的 CA(私有)的明确列表中