相互认证 - 设置、流程、验证
Mutual authentication - setup, flow, verification
我正在单个客户端托管应用程序 (CLIENT) 和我的 spring boot 2 应用程序 (SERVER) 之间实施相互身份验证。我理解的步骤如下:
服务器生成 keystore 和 truststore。 keystore 用于存储服务器的证书和私钥。 truststore 用于存储其他凭据(来自证书颁发机构 (CA) 的证书或受信任的客户端证书)。
A CSR 为服务器引发,然后传递给 CA。 CA 从 CSR 生成签名证书。这是安装在服务器密钥库中。
- 客户端(拥有自己的密钥库和信任库)向服务器提供其 public 密钥。然后将其安装在服务器信任库中。
当从客户端向服务器发出 https 请求时:
- 客户端请求访问受保护的资源。
- 服务器用他们的 public 证书响应。
- 客户端验证该证书(查看信任库并检查它是否由受信任的 CA 签名)。
- 客户端向服务器出示他们的 public 证书。
- 服务器随后根据其信任库验证证书。
- 假设验证成功,客户端被授予访问受保护资源的权限。
所以我有一些事情让我有点困惑...
- 上面概述的步骤大致正确吗?
- 服务器如何验证客户端证书? (我认为它会查看该证书的信任库,但不确定之后实际发生了什么)。
- 我见过在服务器信任库中安装 CA 证书的示例,而不是实际客户端的 public 证书 ~ 是否存在应该或不应该这样做的用例?对于我的用例,我已获得来自客户端(第三方)的签名证书。签署该证书的 CA 与签署服务器证书的 CA 不同。
- 此过程是否实际验证了客户端,即此客户端现在可以访问服务器受保护的资源,但可能出示不同证书的另一个客户端将无法访问? (比如提供用户名和密码的更安全的方法)
- 公用名 (CN) 检查从何而来?我在 Spring Boot X.509 中注意到您可以从 CN 派生用户名,然后使用它从用户详细信息服务中查找适当的用户详细信息。
- 如果客户端证书由于某种原因遭到破坏,是否可以通过将其从服务器的信任库中删除来进行管理?
- 在我使用可信 CA 的场景中是否有优势,例如verisign 在自签名证书上生成客户端证书?即证书直接从受信任的第三方传给我,然后安装。
关于您的第一个问题,是的,您概述的步骤是正确的!这是带有图形概述的一般 mutualSSL
流程:(source)
- A client requests access to a protected resource.
- The server presents its certificate to the client.
- The client verifies the server’s certificate.
- If successful, the client sends its certificate to the server.
- The server verifies the client’s credentials.
- 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
(主题替代名称)。一张证书可以包含多个SAN
。 CN
(和 SAN
)条目是证书的一部分,并在证书签名检查的帮助下进行验证。
你的第六个问题(如果客户端证书由于任何原因被泄露,是否仅通过将其从服务器的信任库中删除来管理? ): 因此 CA
使用所谓的 revocation lists
。例如,如果您使用的是自签名证书,也可以从服务器信任库中删除受损的证书条目。
你的第七个问题(在我使用受信任的 CA 例如 verisign 生成客户端证书而不是自签名证书的场景中是否有优势?): 使用 CA
签名证书而不是自签名证书有一些优点。
- 证书和最终吊销由
CA
管理
- 证书对 public
CA
的每个依赖方都有效,例如威瑞信
- 大多数 public
CA
提供创建证书的标准化方法
我正在单个客户端托管应用程序 (CLIENT) 和我的 spring boot 2 应用程序 (SERVER) 之间实施相互身份验证。我理解的步骤如下:
服务器生成 keystore 和 truststore。 keystore 用于存储服务器的证书和私钥。 truststore 用于存储其他凭据(来自证书颁发机构 (CA) 的证书或受信任的客户端证书)。
A CSR 为服务器引发,然后传递给 CA。 CA 从 CSR 生成签名证书。这是安装在服务器密钥库中。
- 客户端(拥有自己的密钥库和信任库)向服务器提供其 public 密钥。然后将其安装在服务器信任库中。
当从客户端向服务器发出 https 请求时:
- 客户端请求访问受保护的资源。
- 服务器用他们的 public 证书响应。
- 客户端验证该证书(查看信任库并检查它是否由受信任的 CA 签名)。
- 客户端向服务器出示他们的 public 证书。
- 服务器随后根据其信任库验证证书。
- 假设验证成功,客户端被授予访问受保护资源的权限。
所以我有一些事情让我有点困惑...
- 上面概述的步骤大致正确吗?
- 服务器如何验证客户端证书? (我认为它会查看该证书的信任库,但不确定之后实际发生了什么)。
- 我见过在服务器信任库中安装 CA 证书的示例,而不是实际客户端的 public 证书 ~ 是否存在应该或不应该这样做的用例?对于我的用例,我已获得来自客户端(第三方)的签名证书。签署该证书的 CA 与签署服务器证书的 CA 不同。
- 此过程是否实际验证了客户端,即此客户端现在可以访问服务器受保护的资源,但可能出示不同证书的另一个客户端将无法访问? (比如提供用户名和密码的更安全的方法)
- 公用名 (CN) 检查从何而来?我在 Spring Boot X.509 中注意到您可以从 CN 派生用户名,然后使用它从用户详细信息服务中查找适当的用户详细信息。
- 如果客户端证书由于某种原因遭到破坏,是否可以通过将其从服务器的信任库中删除来进行管理?
- 在我使用可信 CA 的场景中是否有优势,例如verisign 在自签名证书上生成客户端证书?即证书直接从受信任的第三方传给我,然后安装。
关于您的第一个问题,是的,您概述的步骤是正确的!这是带有图形概述的一般 mutualSSL
流程:(source)
- A client requests access to a protected resource.
- The server presents its certificate to the client.
- The client verifies the server’s certificate.
- If successful, the client sends its certificate to the server.
- The server verifies the client’s credentials.
- 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
(主题替代名称)。一张证书可以包含多个SAN
。 CN
(和 SAN
)条目是证书的一部分,并在证书签名检查的帮助下进行验证。
你的第六个问题(如果客户端证书由于任何原因被泄露,是否仅通过将其从服务器的信任库中删除来管理? ): 因此 CA
使用所谓的 revocation lists
。例如,如果您使用的是自签名证书,也可以从服务器信任库中删除受损的证书条目。
你的第七个问题(在我使用受信任的 CA 例如 verisign 生成客户端证书而不是自签名证书的场景中是否有优势?): 使用 CA
签名证书而不是自签名证书有一些优点。
- 证书和最终吊销由
CA
管理
- 证书对 public
CA
的每个依赖方都有效,例如威瑞信 - 大多数 public
CA
提供创建证书的标准化方法