【发布时间】:2019-03-18 19:36:03
【问题描述】:
我正在单个客户端托管应用程序 (CLIENT) 和我的 Spring Boot 2 应用程序 (SERVER) 之间实现相互身份验证。我理解的步骤如下:
服务器生成 keystore 和 truststore。 keystore 用于存储服务器的证书和私钥。 truststore 用于存储其他凭据(来自证书颁发机构 (CA) 的证书或受信任的客户端证书)。
为服务器生成一个 CSR,然后将其传递给 CA。 CA 从 CSR 生成签名证书。这是安装在服务器密钥库中的。
- 客户端(拥有自己的密钥库和信任库)将其公钥提供给服务器。然后将其安装在服务器信任库中。
当客户端向服务器发出 https 请求时:
- 客户端发出访问受保护资源的请求。
- 服务器使用其公共证书进行响应。
- 客户端验证该证书(查看信任库并检查它是否由受信任的 CA 签名)。
- 客户端向服务器出示他们的公共证书。
- 服务器随后根据其信任库验证证书。
- 假设验证成功客户端被授予访问受保护资源的权限。
所以我有一些我有点困惑的事情......
- 上述步骤大体上是否正确?
- 服务器如何验证客户端证书? (我认为它会查看该证书的信任库,但不确定之后实际发生了什么)。
- 我已经看到了在服务器信任库中安装 CA 证书而不是实际客户端的公共证书的示例 ~ 是否存在应该或不应该这样做的用例?对于我的用例,我已经获得了来自客户端(第三方)的签名证书。签署该证书的 CA 与签署服务器证书的 CA 不同。
- 这个过程是否真的验证了客户端,即这个客户端现在可以访问服务器受保护的资源,但另一个可能提供不同证书的客户端将无法访问? (例如提供用户名和密码的更安全的方法)
- 通用名 (CN) 检查在这一切中起到什么作用?我注意到在 Spring Boot X.509 中,您可以从 CN 获取用户名,然后使用它从用户详细信息服务中查找适当的用户详细信息。
- 如果客户端证书因任何原因受到损害,只需将其从服务器的信任库中删除即可管理?
- 在我使用可信 CA 的场景中是否有优势,例如威瑞信在自签名证书上生成客户端证书?即证书直接从受信任的第三方传递给我,然后安装。
【问题讨论】:
标签: security spring-boot spring-security https mutual-authentication