跳到主要内容

2. 密钥交换算法 (Key Exchange Algorithm)

本文档为 TLS 定义三种新的基于 ECC 的 key exchange algorithm. 它们都使用 Ephemeral ECDH (ECDHE) 来计算 TLS premaster secret, 彼此只在用于 authentication 的机制 (如果有) 上不同. TLS master secret 从 premaster secret 派生的过程, 以及后续 bulk encryption/MAC key 和 initialization vector 的生成, 都独立于 key exchange algorithm, 不受引入 ECC 的影响.

表 1 概述这些新的 key exchange algorithm. 当且仅当生成并使用新的临时密钥且使用后销毁时, 这些 key exchange algorithm 才提供 forward secrecy.

算法 (Algorithm)描述 (Description)
ECDHE_ECDSA带 ECDSA 或 EdDSA signature 的 Ephemeral ECDH.
ECDHE_RSA带 RSA signature 的 Ephemeral ECDH.
ECDH_anonAnonymous ephemeral ECDH, 无 signature.

表 1: ECC Key Exchange Algorithm

这些 key exchange 分别类似于 DHE_DSS、DHE_RSA 和 DH_anon.

使用 ECDHE_RSA 时, server 可以复用其现有 RSA certificate, 并且容易遵守受限 client 的 elliptic curve 偏好 (参见第 4 节). 然而, 与不提供 forward secrecy 的传统 RSA key exchange 相比, ECDHE_RSA 给 server 带来的计算成本更高.

anonymous key exchange algorithm 不提供对 server 或 client 的 authentication. 与其他 anonymous TLS key exchange 一样, 它容易受到 man-in-the-middle attack. 使用 TLS 和该算法的应用 SHOULD 通过其他方式提供 authentication.

          Client                                        Server
------ ------
ClientHello -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*+
<-------- ServerHelloDone
Certificate*+
ClientKeyExchange
CertificateVerify*+
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data

* message is not sent under some conditions
+ message is not sent unless client authentication
is desired

图 1: 完整 TLS 1.2 Handshake 中的 Message Flow

图 1 展示 TLS key establishment protocol (即 full handshake) 涉及的所有 message. ECC 的加入只直接影响 ClientHello、ServerHello、server 的 Certificate message、ServerKeyExchange、ClientKeyExchange、CertificateRequest、client 的 Certificate message 以及 CertificateVerify. 接下来, 我们从这些 message 的内容和处理角度更详细地描述 ECC key exchange algorithm. 为便于说明, client authentication 及其相关 message (图 1 中以 "+" 标识) 的讨论推迟到第 3 节, 可选的 ECC-specific extension (影响 Hello message) 的讨论推迟到第 4 节.

2.1. ECDHE_ECDSA

在 ECDHE_ECDSA 中, server 的 certificate MUST 包含可用于 ECDSA 或 EdDSA 的 public key.

server 在 ServerKeyExchange message 中发送其 ephemeral ECDH public key 以及对应曲线的说明. 这些参数 MUST 使用与 server Certificate 中 public key 对应的 private key 通过 ECDSA 或 EdDSA 签名.

client 在与 server 的 ephemeral ECDH key 相同的曲线上生成 ECDH key pair, 并在 ClientKeyExchange message 中发送其 public key.

client 和 server 都执行 ECDH operation (参见第 5.10 节), 并将得到的 shared secret 用作 premaster secret.

2.2. ECDHE_RSA

该 key exchange algorithm 与 ECDHE_ECDSA 相同, 只是 server 的 certificate MUST 包含被授权用于签名的 RSA public key, 且 ServerKeyExchange message 中的 signature 必须使用对应的 RSA private key 计算.

2.3. ECDH_anon

注意: 尽管名称以 "ECDH_" 开头 (没有 E), ECDH_anon 中使用的 key 与 ECDHE_RSA 和 ECDHE_ECDSA 中的 key 一样是临时的. 这种命名沿用 DH_anon 的例子, 其中 key 也是临时的, 但名称未反映这一点.

在 ECDH_anon 中, server 的 Certificate、CertificateRequest、client 的 Certificate 和 CertificateVerify message MUST NOT 发送.

server MUST 在 ServerKeyExchange message 中发送 ephemeral ECDH public key 以及对应曲线的说明. 这些参数 MUST NOT 被签名.

client 在与 server 的 ephemeral ECDH key 相同的曲线上生成 ECDH key pair, 并在 ClientKeyExchange message 中发送其 public key.

client 和 server 都执行 ECDH operation, 并将得到的 shared secret 用作 premaster secret. 所有 ECDH 计算均按第 5.10 节规定执行.

2.4. Certificate Chain 中的算法

本规范不对 certificate chain 中任何位置使用的 signature scheme 施加限制. 本文档的上一版本要求 signature 匹配, 但该限制源自早期 TLS 版本, 此处像 RFC 5246 中一样将其取消.