在这个特定的 TLS 1.2 连接中使用了多少个密钥?
至少有三个键:
- X.509 公钥:所有可以连接到服务器的各方都知道:用于标识服务器并作为初始密钥交换的一部分(非对称密钥对的前半部分)。
- X.509 私钥:只有服务器知道:用于证明服务器有权将自己表示为公钥的主体(非对称密钥对的后半部分)
- 会话密钥:服务器和连接的单个客户端都知道:通过密钥交换协商并根据密码套件配置替换的对称密钥。用于加密通过 TLS 连接发送的数据
在某些配置中,会话密钥可以在会话期间无缝替换。这可用于在支持它的密码套件中提供 PFS(完美前向保密)。
可用于单个连接的会话密钥的数量没有内在限制。
在某些配置中,一个或多个 X.509 CA 中间公钥(链)也在服务器公钥的签名链中。这些对于连接到由同一链签名的任何服务器和服务器的所有各方都是已知的。服务器必须在 TLS 握手期间提供这些密钥。在 CA 验证的 TLS 连接的所有配置中,链将由您的客户端软件配置为固有信任的根 CA 在根处签名。
如果您包含 CA 证书,则至少有四个密钥,如果使用中间 CA 证书,则可能更多。
总共应该有十六(16)个键可以播放:
(a) GeoTrust Global CA 签名密钥,用于自签名 GeoTrust 的证书,以及签署 Google Internet Authority G2 的证书。只有地理信任知道这一点。
(b) GeoTrust Global CA 验证密钥,用于验证 GeoTrust 证书和 Google Internet Authority G2 证书上的签名。每个人都知道。
(c) Google Internet Authority G2 的签名密钥,用于签署 Google.ca 的证书。只有 Google Internet Authority G2 知道。
(d) Google Internet Authority G2 的验证密钥,用于验证 google.ca 证书上的签名。每个人都知道。
(e) Google.ca 的签名密钥,用于签署 Google.ca 的临时椭圆曲线 Diffie-Hellman (ECDHE) 公钥。只有 google.ca 知道。
(f) Google.ca 的验证密钥,用于验证 google.ca 的 ECDHE 公钥上的签名。每个人都知道。
(g) Google.ca 的 ECDHE 公钥,发送给客户进行密钥协商。每个人都知道。
(h) Google.ca 的 ECDHE 私钥,用于生成相应的公钥,并应用于客户端的公钥,形成共享密钥。只有 Google.ca 知道。
(i) 客户的 ECDHE 公钥,发送到 google.ca 以进行密钥协商。每个人都知道。
(j) 客户的ECDHE私钥,用于生成对应的公钥,并应用于google.ca的公钥形成共享密钥。只有客户知道。
(k) 共享秘密。它是 ECDHE 密钥交换的结果,也称为预主密钥。只有客户端和服务器知道。
(l) 主机密。派生自 pre-master secret 和客户端/服务器随机值,并用于派生以下对称密钥。只有客户端和服务器知道。
(m) 客户端写入对称加密密钥。只有客户端和服务器知道。
(n) 服务器写入对称加密密钥。只有客户端和服务器知道。
(o) 客户端写入 MAC 密钥。只有客户端和服务器知道。
(p) 服务器写入 MAC 密钥。只有客户端和服务器知道。
请参阅HTTPS 连接的前几毫秒,生成大量密钥部分。
你有:
- cient_write_MAC_secret[SecurityParameters.hash_size]
- server_write_MAC_secret[SecurityParameters.hash_size]
- client_write_key[SecurityParameters.key_material_length]
- server_write_key[SecurityParameters.key_material_length]
- client_write_IV[SecurityParameters.IV_size]
- server_write_IV[SecurityParameters.IV_size]
尽管您是否调用 IVs 密钥是另一回事(而且它们也可能不被使用,例如在 AES 流密码模式下)。
您还将在证书中拥有私钥和公钥。
双方都知道上述所有密钥,但只有服务器知道的私钥除外。MAC 用于验证每条消息,而 write_keys 用于加密它们。请注意,客户端和服务器使用不同的密钥来加密消息。
公钥和私钥对用于对服务器进行身份验证——也就是说,客户端知道他们正在与正确的服务器通信并且连接没有被拦截。这要么是因为客户端加密了一个只能由服务器在其知道私钥的情况下才能解密的秘密,要么是因为服务器发送了由私钥签名的随机数(在 Diffie-Hellman 的情况下)。客户端可以使用公钥来验证签名。