3.1 Protocol Versions (协议版本)
3.1.1 SSL/TLS Protocol Versions (SSL/TLS 协议版本)
停止使用旧的, 不太安全的 SSL/TLS 版本和开始使用现代的, 更安全的版本都很重要; 因此, 以下是关于 TLS/SSL 协议版本的建议:
-
实现必须不协商 SSL 版本 2。
理由: 今天, SSLv2 被认为是不安全的 [RFC6176]。
-
实现必须不协商 SSL 版本 3。
理由: SSLv3 [RFC6101] 是对 SSLv2 的改进, 并填补了一些重大的安全漏洞, 但不支持强密码套件。SSLv3 不支持 TLS 扩展, 其中一些 (例如, renegotiation_info [RFC5746]) 对安全至关重要。此外, 随着 POODLE 攻击 [POODLE] 的出现, SSLv3 现在被广泛认为是根本上不安全的。有关更多详细信息, 请参阅 [DEP-SSLv3]。
-
实现不应该协商 TLS 版本 1.0 [RFC2246]; 唯一的例外是在协商中没有更高版本可用时。
理由: TLS 1.0 (于 1999 年发布) 不支持许多现代的强密码套件。此外, TLS 1.0 缺少用于基于 CBC 的密码套件的每记录初始化向量 (Initialization Vector, IV), 并且不会对常见的填充错误发出警告。
-
实现不应该协商 TLS 版本 1.1 [RFC4346]; 唯一的例外是在协商中没有更高版本可用时。
理由: TLS 1.1 (于 2006 年发布) 是对 TLS 1.0 的安全改进, 但仍不支持某些更强的密码套件。
-
实现必须支持 TLS 1.2 [RFC5246], 并且必须优先协商 TLS 版本 1.2 而不是早期版本的 TLS。
理由: 几个更强的密码套件仅在 TLS 1.2 (于 2008 年发布) 中可用。实际上, 本文档推荐的密码套件 (下面的第 4.2 节) 仅在 TLS 1.2 中可用。
本 BCP 适用于 TLS 1.2 以及更早的版本。读者不能安全地假设本 BCP 中的建议适用于任何未来版本的 TLS。
3.1.2 DTLS Protocol Versions (DTLS 协议版本)
DTLS 是 TLS 对 UDP 数据报的适配, 在 TLS 1.1 发布时引入。以下是关于 DTLS 的建议:
-
实现不应该协商 DTLS 版本 1.0 [RFC4347]。
DTLS 版本 1.0 对应于 TLS 版本 1.1 (见上文)。
-
实现必须支持并且必须优先协商 DTLS 版本 1.2 [RFC6347]。
DTLS 版本 1.2 对应于 TLS 版本 1.2 (见上文)。(没有 DTLS 版本 1.1。)
3.1.3 Fallback to Lower Versions (回退到较低版本)
在服务器拒绝较高版本的协议后 "回退" 到较低版本协议的客户端必须不回退到 SSLv3 或更早版本。
理由: 一些客户端实现在服务器拒绝较高版本的协议时会回退到较低版本的 TLS 甚至 SSLv3。这种回退可能被中间人 (man-in-the-middle, MITM) 攻击者强制执行。TLS 1.0 和 SSLv3 的安全性远低于本文档推荐的 TLS 1.2 版本。虽然仅支持 TLS 1.0 的服务器仍然相当常见, 但 IP 扫描显示, 仅支持 SSLv3 的服务器仅占当前 Web 服务器总数的约 3%。(在撰写本文时, 最近在 [RFC7507] 中定义了一种明确的防止降级攻击的方法。)