传输层安全 (TLS)
任何使用传输层安全 (TLS) 的连接的安全性在很大程度上取决于所选的密码套件和安全参数。本文的目的是帮助您做出这些决定,以确保客户端和服务器之间通信的机密性和完整性。Mozilla 运营安全 (OpSec) 团队维护了一个 wiki 条目,其中包含服务器的参考配置。
传输层安全 (TLS) 协议是使两个网络应用程序或设备能够私密而健壮地交换信息的标准。使用 TLS 的应用程序可以选择其安全参数,这可能对数据的安全性和可靠性产生重大影响。本文概述了 TLS 以及在保护您的内容时需要做出的各种决策。
History
当 HTTPS 推出时,它基于 Netscape 推出的技术 Secure Sockets Layer (SSL) 2.0。不久之后,它更新到 SSL 3.0,随着其使用范围的扩大,很明显需要指定一种通用的、标准的加密技术来确保所有 Web 浏览器和服务器之间的互操作性。 互联网工程任务组 (IETF) 在 1999 年 1 月的 RFC 2246 中指定了 TLS 1.0。TLS 的当前版本是 1.3(RFC 8446)。
尽管现在 Web 使用 TLS 进行加密,但许多人出于习惯仍称其为“SSL”。
虽然 TLS 可以建立在任何低级传输协议之上,但该协议的最初目标是加密 HTTP 流量。使用 TLS 加密的 HTTP 通常称为 HTTPS。默认情况下,TLS 加密的 Web 流量约定使用端口 443 进行交换,而未加密的 HTTP 默认使用端口 80。HTTPS 仍然是 TLS 的重要用例。
基于 TLS 的 HTTP
TLS 提供三项主要服务,有助于确保与其交换数据的安全性和可靠性
- 身份验证
-
身份验证允许通信的每一方验证另一方是否是其声称的那个人。
- 加密
-
数据在用户代理和服务器之间传输时会被加密,以防止未经授权的方读取和解释。
- 完整性
-
TLS 确保在加密、传输和解密数据之间,没有信息丢失、损坏、篡改或伪造。
TLS 连接以握手阶段开始,在此阶段,客户端和服务器就共享密钥和重要参数(如密码套件)达成一致。一旦参数和数据交换模式被协商好,就可以交换应用程序数据,例如 HTTP。
密码套件
TLS 握手协商的主要参数是 密码套件。
在 TLS 1.2 及更早版本中,协商的密码套件包含一组加密算法,这些算法共同提供共享密钥的协商、服务器进行身份验证的方式以及用于加密数据的方法。
TLS 1.3 中的密码套件主要负责数据加密,密钥协商和身份验证使用单独的协商方法。
不同的软件可能对相同的密码套件使用不同的名称。例如,OpenSSL 和 GnuTLS 中使用的名称与 TLS 标准中的名称不同。Mozilla OpSec 团队关于 TLS 配置的文章中的 密码名称对应表 列出了这些名称以及兼容性和安全级别信息。
配置您的服务器
正确配置服务器至关重要。一般来说,您应该尝试将密码支持限制在与您希望连接到您站点的浏览器兼容的最新密码上。 Mozilla OpSec TLS 配置指南 提供了有关推荐配置的更多信息。
为了帮助您配置您的站点,Mozilla 提供了一个有用的 TLS 配置生成器,它可以为以下 Web 服务器生成配置文件
- Apache
- Nginx
- Lighttpd
- HAProxy
- Amazon Web Services CloudFormation Elastic Load Balancer
使用 配置器 是创建满足您需求的配置的推荐方法;然后将其复制并粘贴到您服务器上的相应文件中,然后重新启动服务器以应用更改。配置文件可能需要进行一些调整以包含自定义设置,因此请务必在使用的生成配置之前对其进行审查;如果不确保域名引用等正确而安装配置文件,将导致服务器无法正常工作。
TLS 1.3
RFC 8446:TLS 1.3 是对 TLS 的重大修订。TLS 1.3 包含许多改进安全性和性能的更改。TLS 1.3 的目标是
- 移除 TLS 1.2 中未使用且不安全的功能。
- 在设计中包含强大的安全分析。
- 通过加密协议的更多部分来提高隐私性。
- 减少完成握手所需的时间。
TLS 1.3 改变了协议的许多基本原理,但保留了之前 TLS 版本几乎所有的基本功能。对于 Web 而言,在不影响兼容性的情况下可以启用 TLS 1.3,但有一些罕见的例外(如下所述)。
TLS 1.3 的主要变化是
- 在大多数情况下,TLS 1.3 握手完成于一次往返,从而降低了握手延迟。
- 服务器可以启用 0-RTT(零往返时间)握手。重新连接到服务器的客户端可以立即发送请求,从而完全消除了 TLS 握手的延迟。虽然 0-RTT 的性能提升可能很显著,但伴随着重放攻击的风险,因此在启用此功能之前需要谨慎。
- TLS 1.3 仅支持前向保密模式,除非连接正在恢复或使用预共享密钥。
- TLS 1.3 定义了一组新的、仅 TLS 1.3 专有的密码套件。这些密码套件都使用现代的带关联数据的认证加密 (AEAD) 算法。
- TLS 1.3 握手是加密的,除了建立共享密钥所需的那些消息。特别是,这意味着服务器和客户端证书是加密的。但请注意,客户端发送给服务器的服务器身份(server_name 或 SNI 扩展)未加密。
- 许多机制已被禁用:重协商、通用数据压缩、数字签名算法 (DSA) 证书、静态 RSA 密钥交换以及自定义 Diffie–Hellman (DH) 组的密钥交换。
TLS 1.3 草案版本的实现已可用。TLS 1.3 已在某些浏览器中启用,包括 0-RTT 模式。启用 TLS 1.3 的 Web 服务器可能需要调整配置以允许 TLS 1.3 成功运行。
TLS 1.3 增加了一个重要的新的用例。0-RTT 握手可以为对延迟敏感的应用程序(如 Web)提供显著的性能提升。启用 0-RTT 需要额外的步骤,以确保成功部署并管理重放攻击的风险。
TLS 1.3 中移除重协商可能会影响某些依赖客户端证书身份验证的 Web 服务器。一些 Web 服务器使用重协商来确保客户端证书被加密,或仅在请求某些资源时才请求客户端证书。为了保护客户端证书的隐私,TLS 1.3 握手的加密确保了客户端证书的加密;但这可能需要一些软件更改。TLS 1.3 支持对证书进行响应式身份验证,但尚未得到广泛实施。正在开发替代机制,这些机制也将支持 HTTP/2。
弃用旧版 TLS
为了帮助构建一个更现代、更安全的 Web,所有主流浏览器从 2020 年初开始就已停止支持 TLS 1.0 和 1.1。您需要确保您的 Web 服务器在未来支持 TLS 1.2 或 1.3。
从 74 版本开始,当连接到使用旧 TLS 版本的服务器时,Firefox 将返回一个安全连接失败错误(Firefox bug 1606734)。
TLS 握手超时值
如果 TLS 握手由于某种原因开始变得缓慢或无响应,用户体验可能会受到严重影响。为了缓解这个问题,现代浏览器已经实现了握手超时
- 自 58 版本起,Firefox 实现了一个 TLS 握手超时,默认值为 30 秒。可以通过在 about:config 中编辑
network.http.tls-handshake-timeout首选项来更改超时值。
另见
- Mozilla SSL 配置生成器和 Cipherlist.eu 可以帮助您为服务器生成配置文件以保护您的站点。
- Mozilla 运营安全 (OpSec) 团队维护着一个 wiki 页面,其中包含参考 TLS 配置。
- 使用 HTTP Observatory 和 SSL Labs 来测试网站的 HTTP/TLS 配置有多安全。
- 安全上下文
- Strict-Transport-Security HTTP 头