【问题标题】:Mutual authentication - setup, flow, verification相互认证 - 设置、流程、验证
【发布时间】:2019-03-18 19:36:03
【问题描述】:

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

  • 服务器生成 keystoretruststorekeystore 用于存储服务器的证书和私钥。 truststore 用于存储其他凭据(来自证书颁发机构 (CA) 的证书或受信任的客户端证书)。

  • 为服务器生成一个 CSR,然后将其传递给 CA。 CA 从 CSR 生成签名证书。这是安装在服务器密钥库中的。

  • 客户端(拥有自己的密钥库和信任库)将其公钥提供给服务器。然后将其安装在服务器信任库中。

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

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

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

  • 上述步骤大体上是否正确?
  • 服务器如何验证客户端证书? (我认为它会查看该证书的信任库,但不确定之后实际发生了什么)。
  • 我已经看到了在服务器信任库中安装 CA 证书而不是实际客户端的公共证书的示例 ~ 是否存在应该或不应该这样做的用例?对于我的用例,我已经获得了来自客户端(第三方)的签名证书。签署该证书的 CA 与签署服务器证书的 CA 不同。
  • 这个过程是否真的验证了客户端,即这个客户端现在可以访问服务器受保护的资源,但另一个可能提供不同证书的客户端将无法访问? (例如提供用户名和密码的更安全的方法)
  • 通用名 (CN) 检查在这一切中起到什么作用?我注意到在 Spring Boot X.509 中,您可以从 CN 获取用户名,然后使用它从用户详细信息服务中查找适当的用户详细信息。
  • 如果客户端证书因任何原因受到损害,只需将其从服务器的信任库中删除即可管理?
  • 在我使用可信 CA 的场景中是否有优势,例如威瑞信在自签名证书上生成客户端证书?即证书直接从受信任的第三方传递给我,然后安装。

【问题讨论】:

    标签: security spring-boot spring-security https mutual-authentication


    【解决方案1】:

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

    1. 客户端请求访问受保护的资源。
    2. 服务器将其证书提供给客户端。
    3. 客户端验证服务器的证书。
    4. 如果成功,客户端将其证书发送到服务器。
    5. 服务器验证客户端的凭据。
    6. 如果成功,服务器将授予对客户端请求的受保护资源的访问权限。

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

    您的第三个问题(包含客户端公钥/证书或相应 CA 证书的服务器信任库?): 如果您使用例如自签名证书,您可能必须将客户端公钥/证书直接导入服务器信任库。如果您的客户端使用CA 签名证书,则服务器只存储CA 公钥/证书是合适的,因为它用于验证客户端证书。

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

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

    您的第六个问题(如果客户端证书因任何原因而受到损害,只需将其从服务器的信任库中删除即可管理?):因此CAs使用所谓的revocation lists。例如,如果您使用的是自签名证书,也可以从服务器信任库中删除受损的证书条目。

    您的第七个问题(在我使用受信任的 CA(例如威瑞信)生成客户端证书而不是自签名证书的情况下,是否有优势?):使用CA 签名证书而不是自签名证书有一些优点。

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

    【讨论】:

    • @git-flow 谢谢你的回答我真的很感激。关于 CA 验证(问题 2),CA 可能必须特定于该服务器。即客户端提出一个 csr 和服务器然后用他们的 CA 签署它?关于问题 2,当不使用 CA(即客户端证书直接安装到服务器信任库中)时,验证如何工作?
    • CA 通常被服务器和客户端接受。如果客户端没有 CA 签发的证书,则服务器必须在其信任库中拥有客户端的公共证书。所以服务器可以验证客户端的请求。
    猜你喜欢
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2012-11-19
    • 2012-09-12
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多