1

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

4

1 回答 1

2

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

由于此示例中使用了相同的自签名证书,因此请确保只能使用您的证书。

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

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

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

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

并且永远不要在代码中使用核心客户端证书/指纹,因为它们会定期更改,因此外部帐户目录(使用带外进程更新)是必要的。

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

根据您的添加进行编辑:

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

  • 验证通用链(即时间有效性、扩展、撤销等)
  • 验证直接发行人是否在您批准的 CA(私有)的明确列表中
于 2021-06-03T19:15:02.387 回答