相互认证 - 设置、流程、验证

Mutual authentication - setup, flow, verification

我正在单个客户端托管应用程序 (CLIENT) 和我的 spring boot 2 应用程序 (SERVER) 之间实施相互身份验证。我理解的步骤如下:

当从客户端向服务器发出 https 请求时:

  1. 客户端请求访问受保护的资源。
  2. 服务器用他们的 public 证书响应。
  3. 客户端验证该证书(查看信任库并检查它是否由受信任的 CA 签名)。
  4. 客户端向服务器出示他们的 public 证书。
  5. 服务器随后根据其信任库验证证书。
  6. 假设验证成功,客户端被授予访问受保护资源的权限。

所以我有一些事情让我有点困惑...

关于您的第一个问题,是的,您概述的步骤是正确的!这是带有图形概述的一般 mutualSSL 流程:(source)

  1. A client requests access to a protected resource.
  2. The server presents its certificate to the client.
  3. The client verifies the server’s certificate.
  4. If successful, the client sends its certificate to the server.
  5. The server verifies the client’s credentials.
  6. If successful, the server grants access to the protected resource requested by the client.

您的第二个问题(服务器如何验证客户端证书?): 服务器在签名的帮助下验证客户端证书。签名通常是哈希值,是完整证书的构建。散列值使用相应 CA(证书颁发机构)的私钥签名。服务器在 CA 的 public 证书的帮助下验证客户端证书的签名。

你的第三个问题(Servers truststore containing the clients public key/certificate or the corresponding CA certificate? ): 例如,如果您使用自签名证书,您可能必须将客户端 public key/certificate 直接导入服务器信任库。如果您的客户端使用 CA 签名证书,您的服务器只存储 CA public key/certificate 是合适的,因为它用于验证客户端证书。

你的第四个问题(这个过程是否真的验证了客户端):是的!正如您在第二个问题的答案中看到的那样,证书是通过检查签名来验证的。签名是完整证书的散列。标准 X.509 包含识别主题的信息。通过检查签名,主体被认证。标准 X.509 证书包含其他内容,例如这条信息: 主题名称,主题 Public 密钥信息,Public 密钥算法,发行者唯一标识符(可选),...

你的第五问题(CN检查在哪里?):CN(常用名)验证是在证书检查。 CN 标识当前证书的有效主机名。它仅限于一个条目。作为扩展,引入了 SAN(主题替代名称)。一张证书可以包含多个SANCN(和 SAN)条目是证书的一部分,并在证书签名检查的帮助下进行验证。

你的第六个问题(如果客户端证书由于任何原因被泄露,是否仅通过将其从服务器的信任库中删除来管理? ): 因此 CA 使用所谓的 revocation lists。例如,如果您使用的是自签名证书,也可以从服务器信任库中删除受损的证书条目。

你的第七个问题(在我使用受信任的 CA 例如 verisign 生成客户端证书而不是自签名证书的场景中是否有优势?): 使用 CA 签名证书而不是自签名证书有一些优点。

  • 证书和最终吊销由 CA
  • 管理
  • 证书对 public CA 的每个依赖方都有效,例如威瑞信
  • 大多数 public CA 提供创建证书的标准化方法