我正在尽力理解相互 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/