相互认证 - 设置、流程、验证
Posted
技术标签:
【中文标题】相互认证 - 设置、流程、验证【英文标题】:Mutual authentication - setup, flow, verification 【发布时间】: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 的场景中是否有优势,例如威瑞信在自签名证书上生成客户端证书?即证书直接从受信任的第三方传递给我,然后安装。【问题讨论】:
【参考方案1】:关于您的第一个问题,是的,您概述的步骤是正确的!这是带有图形概览的一般mutualSSL
流程:(source)
客户端请求访问受保护的资源。 服务器将其证书提供给客户端。 客户端验证服务器的证书。 如果成功,客户端将其证书发送到服务器。 服务器验证客户端的凭据。 如果成功,服务器将授予对客户端请求的受保护资源的访问权限。
您的第二个问题(服务器如何验证客户端证书?):
服务器在签名的帮助下验证客户端证书。签名通常是一个哈希值,是完整证书的构建。哈希值使用对应的CA
(证书颁发机构)的私钥签名。服务器借助CA
的公共证书验证客户端证书的签名。
您的第三个问题(包含客户端公钥/证书或相应 CA 证书的服务器信任库?):
如果您使用例如自签名证书,您可能必须将客户端公钥/证书直接导入服务器信任库。如果您的客户端使用CA
签名证书,则服务器只存储CA
公钥/证书是合适的,因为它用于验证客户端证书。
您的第四个问题(此过程是否真的验证了客户端):是的!正如您在第二个问题的答案中看到的那样,通过检查签名来验证证书。签名是完整证书的散列。标准X.509
包含识别主题的信息。通过检查签名,主体被验证。标准的X.509
证书包含其他内容,例如这条信息:
主题名称、主题公钥信息、公钥算法、颁发者唯一标识符(可选)、...
您的第五个问题(CN检查在哪里?):在证书检查期间执行CN
(通用名)验证。 CN
标识当前证书的有效主机名。它仅限于一个条目。作为扩展,引入了SAN
(主题替代名称)。一个证书可以包含多个SAN
。 CN
(和SAN
)条目是证书的一部分,并在证书签名检查的帮助下进行验证。
您的第六个问题(如果客户端证书因任何原因而受到损害,只需将其从服务器的信任库中删除即可管理?):因此CA
s使用所谓的revocation lists
。例如,如果您使用的是自签名证书,也可以从服务器信任库中删除受损的证书条目。
您的第七个问题(在我使用受信任的 CA(例如威瑞信)生成客户端证书而不是自签名证书的情况下,是否有优势?):使用CA
签名证书而不是自签名证书有一些优点。
CA
管理
证书对公众CA
的每个依赖方都有效,例如威瑞信
大多数公众CA
s 提供创建证书的标准化方法
【讨论】:
@git-flow 谢谢你的回答我真的很感激。关于 CA 验证(问题 2),CA 可能必须特定于该服务器。即客户端提出一个 csr 和服务器然后用他们的 CA 签署它?关于问题 2,当不使用 CA(即客户端证书直接安装到服务器信任库中)时,验证如何工作? CA 通常被服务器和客户端接受。如果客户端没有 CA 签发的证书,则服务器必须在其信任库中拥有客户端的公共证书。所以服务器可以验证客户端的请求。以上是关于相互认证 - 设置、流程、验证的主要内容,如果未能解决你的问题,请参考以下文章