本文参考 High Performance Browser Networking,获取更多详细内容请查看原文。
TLS/SSL的发展历程
在网络安全的发展历程中,SSL(Secure Sockets Layer)协议最初由Netscape公司创建,旨在保护在线交易的安全性。它通过先进的加密技术保护用户的个人信息,同时提供身份验证与数据完整性保障,确保交易过程的安全。
🔍 协议定位:SSL/TLS工作在应用层之上,直接与TCP层交互,使得上层协议(如HTTP、SMTP等)无需修改即可获得安全通信能力。
安全保障:通过适当的SSL/TLS实施,第三方只能:
- 推测连接的端点
- 观察加密方式
- 估计数据传输的频率和数量 而无法读取或干扰实际传输的数据内容。
版本演进
随着IETF对SSL协议的标准化,它被重新命名为TLS(Transport Layer Security,传输层安全协议)。协议版本演进如下:
版本 | 发布时间 | RFC文档 | 主要改进 |
---|---|---|---|
SSL 2.0 | 1995 | - | 初始版本(已废弃) |
SSL 3.0 | 1996 | RFC 6101 | 重大安全改进 |
TLS 1.0 | 1999 | RFC 2246 | IETF标准化 |
TLS 1.1 | 2006 | RFC 4346 | 增强安全性 |
TLS 1.2 | 2008 | RFC 5246 | 现代加密支持 |
TLS 1.3 | 2018 | RFC 8446 | 重大性能优化 |
SSL 2.0为初版,但由于发现了安全隐患,很快被SSL 3.0所取代。随着IETF对该协议的标准化过程,RFC 2246于1999年发布,即TLS 1.0。自那时起,IETF不断对该协议进行修订,以消除发现的安全漏洞并增强其功能:TLS 1.1(RFC 4346)发布于2006年4月,之后是TLS 1.2(RFC 5246)于2008年8月,目前TLS 1.3的标准化工作也在进行。
这一版本迭代的目的是确保服务器能够选择并协商最新的TLS协议版本,以提供最佳的安全性、功能性和性能保障。尤其是在某些对于性能要求较高的功能(如HTTP/2)中,则明确要求使用TLS 1.2或以上版本,否则将中断连接。这表明,良好的安全性与高效的性能是相辅相成的。
TLS协议被设计为运行在可靠的传输协议,如TCP之上,尽管也有调整用以适配数据报协议(如UDP)。定义于RFC 6347的安全数据报传输层协议(DTLS)正是基于TLS,它在保持数据报的传输模型的同时也提供了类似的安全保障。
加密、身份验证与数据完整性
TLS协议提供了三项核心功能:加密、身份验证和数据完整性。虽然在某些情况下不一定要使用所有三项服务,但一个安全的Web应用程序应充分利用这三者。
- 加密:确保数据从一台主机安全传送到另一台主机。
- 认证:确保提供的身份信息的有效性。
- 完整性:确保消息未遭篡改或伪造。
为了创建一个安全的加密数据通道,通信的两方需就使用的密码套件及加密密钥达成一致。TLS协议通过一个定义明确的握手序列来执行此交换,后续我们将深入了解TLS的握手过程。这个握手过程的巧妙之处在于,它运用了公钥密码学(又称非对称密码学),允许每个节点在没有先前知识的情况下达成共享密钥,即使在未加密的通道中也是如此。
在浏览器中使用TLS时,该协议还允许双方执行身份验证,以验证另一方的身份,确保用户与其所信任的实体(例如银行)进行沟通,而非伪造的诈骗者。此外,服务器也可以选择验证客户端的身份,例如企业的代理服务器可以验证员工身份,每位员工都可以拥有自己独特的证书,证书由公司认证机构签发。
通过加密和身份验证,TLS协议提供自己的消息帧机制,并为每条消息附加消息验证码(MAC)以保证消息的完整性和真实性。现代浏览器支持多种密码套件,同时有效地验证客户端和服务器,并对每个记录执行更新的消息完整性检查,确保通信的安全性。
HTTPS的重要性
未加密的通信(例如HTTP及其他协议)容易遭到攻击,可能导致用户的隐私和数据安全性受到损害。这使得我们需要通过HTTPS来传输数据,以抵御此类威胁。
-
HTTPS保护网站完整性:加密帮助防止恶意者篡改数据交换,例如重写内容或注入恶意内容。
-
HTTPS保障用户隐私和安全:加密可以阻止黑客监听信息。无保护请求可能会泄露用户敏感信息,从而危害其身份的匿名性。
-
HTTPS赋能强大功能:许多新网络平台功能(如访问用户地理位置、拍摄视频等)要求明确用户同意,而这要求使用HTTPS。HTTPS提供的安全性和完整性保障是实现安全用户权限的重要组成部分。
为进一步加强这一概念,互联网工程任务组(IETF)及互联网架构委员会(IAB)都倡导开发者优先采用HTTPS。随着对互联网的依赖逐渐加深,作为开发人员和用户,我们有责任确保通过启用HTTPS保护自己。
作为参考,白宫管理和预算办公室发布的HTTPS-Only Standard为HTTPS的需求及其在部署中的应用提供了有价值的资料。
TLS握手过程
在开始传输应用数据之前,客户端与服务器必须完成TLS握手过程。这个过程包括:
- 协商TLS协议版本
- 选择合适的密码套件
- 验证数字证书(如需要)
完整握手流程:
- ClientHello
- 客户端发送支持的TLS版本
- 提供可用的密码套件列表
- 包含其他TLS选项
- ServerHello
- 服务器选择TLS版本和密码套件
- 发送数字证书
- 可选:请求客户端证书
- 密钥交换
- 客户端验证服务器证书
- 生成会话密钥
- 启动RSA或Diffie-Hellman交换
- 完成握手
- 验证密钥交换参数
- 确认消息完整性
- 建立安全通信通道
⚡ 性能优化:标准TLS握手需要2-RTT(往返时间),但可以通过以下方式优化:
- False Start:允许提前发送加密数据
- 会话复用:重用之前的会话参数
- 0-RTT恢复:TLS 1.3中的新特性
RSA、Diffie-Hellman与前向保密
RSA密钥交换的工作流程:
- 客户端生成对称密钥
- 使用服务器公钥加密
- 发送加密的密钥
⚠️ 安全隐患:RSA使用相同的密钥对进行身份验证和密钥加密,一旦私钥泄露,所有历史会话都可能被解密。
Diffie-Hellman密钥交换提供了更安全的解决方案:
- 双方可以安全协商共享密钥
- 无需在握手过程中传输实际密钥
- 支持完全前向保密(Perfect Forward Secrecy)
运用Diffie-Hellman密钥交换和临时会话密钥,可以实现”完全前向保密”,这意即长期密钥的泄露不会造成对以前会话的解读。
如今,RSA握手正逐步被淘汰,越来越多的浏览器支持前向保密密码,并要求仅在启用前向保密的情况下使用某些协议优化。因此,确保您的服务器支持前向保密是至关重要的。
应用层协议协商与服务器名称指示
两个网络对等体若希望通过自定义协议进行通信,理想方法应是预先确立协议并指定使用的知名端口。然而,实际情况复杂,传统方法速度较慢且不够灵活,因此开发出应用层协议协商(ALPN)扩展来解决该问题。
ALPN工作机制
ALPN允许客户端在握手期间附加支持的应用程序协议列表,服务器检查并返回所选协议,帮助加快协议协商过程。
💡 优势:
- 减少协议协商的往返时间
- 支持新协议的无缝切换
- 提高连接建立效率
SNI扩展机制
为了在同一IP地址上管理多个独立站点,TLS引入了服务器名称指示(SNI)扩展。此扩展允许客户端在握手中指明自己想要连接的主机名,服务器能够选择合适的证书与客户端完成握手。
TLS会话恢复与信任链
TLS传输的所有数据都使用定义良好的记录协议进行编码。实施TLS会话恢复能够在多个连接之间重用或共享以前协商的关键数据,从而显著降低性能损失。
会话恢复机制
1. 基于会话ID的恢复 会话标识符在SSL 2.0中首次引入,允许服务器发送32字节的会话标识符,客户端在后续会话中通过包含该标识符来通知服务器使用相同的协商参数,从而实现简短握手。
2. 基于会话票证的恢复 此时,TLS还引入了会话票证机制,简化了服务器端必须维护的会话状态问题。服务器可以在会话票证中记录协商的会话信息并加密,只需客户端在后续连接中提交票证,无需服务器存储状态数据。
信任链建立
身份验证是每个TLS连接的重要一环。用户需确保与他们通信的主机是可信的。公钥加密允许通过加密验证交换的信息来确认身份。这涉及到信任链的建立。
在典型的身份验证过程中,A需要验证B的身份,而B通过使用自己的私钥对消息进行签名,A通过B的公钥验证签名,确保信息的真实性。如此形成信任链,用户得以在网络环境中确认信息的可靠性。为此,数字证书及其颁发机构的选择至关重要。
证书撤销与最好实践
证书撤销原因
当证书需要撤销时(如私钥泄露、颁发机构遭到攻击等),需利用可证实证书的状态机制。证书撤销列表(CRL)与在线证书状态协议(OCSP)都是为确保撤销证书的有效手段。然而,OCSP的实时查询机制能够显著改善撤销状态验证的即时性与可靠性。
OCSP Stapling技术
OCSP Stapling技术则允许服务器在TLS握手期间附加OCSP响应,为客户端提供证书的即时状态信息,显著提高浏览器的安全与性能。
TLS记录协议
最终,我们需要关注TLS记录协议,它定义了在TLS会话传输中如何结构化消息、数据的完整性和安全性。例如,TLS记录将应用程序数据拆分成最大的214字节或16KB的块,添加MAC,最后加密后通过TCP层传输。
⚠️ 性能优化建议 作为应用程序开发人员,确保您在配置中考虑性能优化至关重要,包括保持最新的TLS标准、启用无状态恢复、利用TLS会话缓存等。此外,也要配置HTTP严格传输安全,以确保客户端始终使用HTTPS。
测试与验证
为确保您的配置完美无缺,使用在线服务如Qualys SSL Server Test对公共服务器进行检查,确保其配置、性能与安全性符合最佳实践。此外,熟悉openssl命令行工具能帮助您有效地检查握手和设置过程的重要参数。
🛠️ 常用检查命令
1
2
3
4
5
# 检查服务器TLS配置
openssl s_client -connect example.com:443 -tls1_2
# 验证证书链
openssl verify -CAfile chain.pem cert.pem
📌 配置检查清单
- 定期进行安全扫描
- 监控证书有效期
- 检查密码套件配置
- 验证HSTS策略