security - 为什么相互 SSL 需要客户端的 key 对而不仅仅是公共(public)证书?

标签 security ssl

我正在尽力理解相互 SSL。一个我找不到好的答案的问题是为什么您需要在客户端上创建 key 对而不是仅仅提供公共(public)客户端证书。

到目前为止,我理解以下内容(非常简单):

常规 SSL:

  • 服务器有一对 key 并发送公共(public)部分(证书),因此客户端可以使用该公钥加密消息,这样他们就可以共享对称 key 并最终保护所有通信。
  • 要验证服务器实际上是服务器,默认情况下必须信任证书的颁发者(在信任库中)。

相互 SSL:

  • 完全一样,只是这次服务器要求客户端对自己进行身份验证。
  • 客户端发送其公共(public)证书,该证书根据服务器上的某种“已知证书”列表进行验证。如果匹配,通信可以继续。

我不明白为什么我必须将整个 key 对(以及私有(private)部分)包含在我在客户端使用的 keystore 中。过程中客户端私钥用在什么地方?

最佳答案

The server has a key pair and sends the public part (certificate) so the client can use that public key to encrypt messages so they can share a symmetric key and eventually secure all communication.

这不是服务器证书的要点,使用现代 key 交换方法(即 Diffie-Hellman)证书根本不涉及 key 交换。您所描述的仅适用于过时的 RSA key 交换。

证书的主要作用是用于身份验证。身份验证意味着服务器证明它拥有提供的证书,然后客户端验证证书是否符合其预期,即由受信任的 CA 颁发、预期的主题/SAN、未过期等。

所有权证明是通过签署一些数据(至少部分由对等方提供,即客户端)使用与公钥匹配的私钥来完成的在证书中。对等方(客户端)然后可以使用证书的公钥验证此签名,如果验证通过,则另一方(服务器)显然拥有 secret 私钥,这意味着它拥有证书。

在相互认证中使用客户端证书,过程完全相同,只是角色互换。这就是为什么客户端需要私钥。

关于security - 为什么相互 SSL 需要客户端的 key 对而不仅仅是公共(public)证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56955948/

相关文章:

security - 使用 token 身份验证保护 HLS

security - 保护来自同源服务器的 HTML 内容

Apache 虚拟主机根、www 和子域设置,包括 http 到 https

jquery - 为什么 cakePHP 在通过 jQuery 更改 "disabled"字段后会抛出黑洞?

objective-c - 在 iOS 上验证 SSL 证书

java - 如何验证命令行参数中的用户输入以获得更高的安全性?

java - 续订时如何让 Netty 服务器重新加载 TLS 证书?

Python 服务器 : Chrome Extension SSL certificate

java - 为什么使用 Java 时签名证书会导致握手失败?

mongodb - Spring Boot MongoDB 连接问题