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

Posted

技术标签:

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

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

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

您的第二个问题(服务器如何验证客户端证书?): 服务器在签名的帮助下验证客户端证书。签名通常是一个哈希值,是完整证书的构建。哈希值使用对应的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 签发的证书,则服务器必须在其信任库中拥有客户端的公共证书。所以服务器可以验证客户端的请求。

以上是关于相互认证 - 设置、流程、验证的主要内容,如果未能解决你的问题,请参考以下文章

shiro之身份验证 身份认证流程

得物芯片怎么验证

《SpringSecurity框架专题》-06验证码认证

登录安全验证+AJAX认证服务--流程图

Shiro授权认证原理和流程

SpringSecurity自定义认证