SSL/TLS 通信是否需要两个 public 密钥,一个用于 CA,一个用于服务器?

Does SSL/TLS communication require two public keys, one for CA and one for the server?

我一直在阅读有关安全通信的内容,但对以下内容感到困惑。如果我错了,请纠正我。在我看来,客户端需要两个 public 密钥来建立 SSL 连接。第一个是 CA 的 public 密钥,用于验证服务器发送的证书上的签名。证书上的 CA 签名是使用 CA 的私钥生成的,因此需要 CA 的 public 密钥来验证它。第二个是用于加密对称共享密钥的服务器的 public 密钥。共享密钥由客户端生成并发送到服务器使用服务器的私钥解密,因此需要服务器的 public 密钥对其进行加密。因此我们需要两个不同的 public 键。这个对吗?如果是这样,服务器发送的证书是否包含两个 public 密钥?

这是正确的,客户端需要链中的每个 public 键。

If so, does the certificate sent by the server contain two public keys?

服务器发送的证书通常不是一个证书,而是一个证书链。证书从不由权威机构的根证书签名,而是由中间证书签名,中间证书本身由根证书或其他中间证书签名。浏览器只知道根证书,因此服务器需要发送通向根证书的整个链,否则链中会缺少证书,并且无法验证服务器证书是否由受信任的机构签名.此链中的每个证书都包含自己的 public 密钥,因此链中的每个证书都可以使用直接父 public 密钥进行验证,直到您使用根证书验证链中的最后一个证书指示浏览器信任。

您需要的不仅仅是 CA 的 public 密钥。你需要他自己的证书。这就是传输证书 chain 的原因:除了自签名证书的退化情况外,这将至少包含两个证书。

注意 服务器的 public 密钥不是 'used to encrypt the symmetric shared key'。共享对称密钥由两端秘密独立协商,根本不传输。