71-SSL TLS 握手协议
1、TLS/SSL 的前世今生
SSL(Secure Sockets Layer)最初由 Netscape 定义, 分别有 SSLv2 和 SSLv3 两个版本(SSLv1未曾对外发布),在 SSLv3 之后 SSL 重命名为 TLS。
TLS(Transport Layer Security)版本从 TLSv1.0 开始,TLSv1.0 是在 SSLv3 的基础上升级而来。
协议 | 时间 | 建议 | 说明 |
---|---|---|---|
SSLv1 | - | - | 实际从未公开发布。 |
SSLv2 | 1995 | 弃用 | IETF已于2011年弃用。 |
SSLv3 | 1996 | 弃用 | IETF已于2015年弃用。 |
TLSv1.0 | 1999 | 兼容 | - |
TLSv1.1 | 2006 | 兼容 | - |
TLSv1.2 | 2008 | 主推 | 目前最新可用版本。 |
TLSv1.3 | - | - | 2016开始草案制定。 |
多年以来已弃用的 SSL 协议也暴露出了一些高危漏洞(例如: POODLE, DROWN),因此建议服务器禁用 SSL3.0 及 SSL2.0, 只启用 TLS 协议。
2、证书如何工作
SSL/TLS使用证书来实现对数据的加密传输以及身份认证。
3、握手过程
SSL 握手过程
1 |
|
【注】7、8两步主要是为了防止握手过程消息被纂改
TSL 握手过程
导致握手失败的一些原因
- 两边协议版本不兼容
- 两边加密算法无匹配项
更多关于如何优雅处理HTTPS中的证书问题可参考这里。
4、TLS与SSL的差异
版本号:TLS 记录格式与 SSL 记录格式相同,但版本号的值不同,TLS 的版本 1.0 使用的版本号为 SSLv3.1。
报文鉴别码:SSLv3.0 和 TLS 的 MAC 算法及 MAC 计算的范围不同。TLS 使用了 RFC-2104 定义的 HMAC 算法。SSLv3.0使用了相似的算法,两者差别在于 SSLv3.0 中,填充字节与密钥之间采用的是连接运算,而 HMAC 算法采用的是异或运算。但是两者的安全程度是相同的。
伪随机函数:TLS 使用了称为 PRF 的伪随机函数来将密钥扩展成数据块,是更安全的方式。
报警代码:TLS 支持几乎所有的 SSLv3.0 报警代码,而且 TLS 还补充定义了很多报警代码,如解密失败(
decryption_failed
)、记录溢出(record_overflow
)、未知CA(unknown_ca
)、拒绝访问(access_denied
)等。密文族和客户证书:SSLv3.0 和 TLS 存在少量差别,即 TLS 不支持 Fortezza 密钥交换、加密算法和客户证书。
certificate_verify
和 finished 消息:SSLv3.0 和 TLS 在用certificate_verify
和 finished 消息计算 MD5 和 SHA-1 散列码时,计算的输入有少许差别,但安全性相当。加密计算:TLS 与 SSLv3.0 在计算主密值(master secret)时采用的方式不同。
填充:用户数据加密之前需要增加的填充字节。在SSL 中,填充后的数据长度要达到密文块长度的最小整数倍。而在 TLS 中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析的攻击。
TLS 的主要增强内容
TLS 的主要目标是使 SSL 更安全,并使协议的规范更精确和完善。TLS 在 SSL v3.0 的基础上,提供了以下增强内容:
- 更安全的MAC算法
- 更严密的警报
- “灰色区域”规范的更明确的定义
TLS对于安全性的改进
对于消息认证使用密钥散列法:TLS 使用“消息认证代码的密钥散列法”(HMAC),当记录在开放的网络(如因特网)上传送时,该代码确保记录不会被变更。SSLv3.0 还提供键控消息认证,但 HMAC 比 SSLv3.0 使用的(消息认证代码)MAC 功能更安全。
增强的伪随机功能(PRF):PRF 生成密钥数据。在 TLS 中,HMAC 定义 PRF。PRF 使用两种散列算法保证其安全性。如果任一算法暴露了,只要第二种算法未暴露,则数据仍然是安全的。
改进的已完成消息验证:TLS 和 SSLv3.0 都对两个端点提供已完成的消息,该消息认证交换的消息没有被变更。然而,TLS 将此已完成消息基于 PRF 和 HMAC 值之上,这也比 SSLv3.0更安全。
一致证书处理:与 SSLv3.0 不同,TLS 试图指定必须在 TLS 之间实现交换的证书类型。
特定警报消息:TLS 提供更多的特定和附加警报,以指示任一会话端点检测到的问题。TLS 还对何时应该发送某些警报进行记录。
Reference
- [1] RFC6176 - Prohibiting Secure Sockets Layer (SSL) Version 2.0 https://tools.ietf.org/html/rfc6176
- [2] RFC7568 - Deprecating Secure Sockets Layer Version 3.0 https://tools.ietf.org/html/rfc7568
- [3] RFC2246 - The TLS Protocol Version 1.0 https://tools.ietf.org/html/rfc2246
- [4] RFC4346 - The Transport Layer Security (TLS) Protocol Version 1.1 https://tools.ietf.org/html/rfc4346
- [5] RFC5246 - The Transport Layer Security (TLS) Protocol Version 1.2 https://tools.ietf.org/html/rfc5246
- [6] RFC2246 - The TLS Protocol Version 1.0 https://tools.ietf.org/html/rfc2246
- [7] RFC4346 - The Transport Layer Security (TLS) Protocol Version 1.1 https://tools.ietf.org/html/rfc4346
- [8] RFC5246 - The Transport Layer Security (TLS) Protocol Version 1.2 https://tools.ietf.org/html/rfc5246
- [9] The Transport Layer Security (TLS) Protocol Version 1.3 https://tools.ietf.org/html/draft-ietf-tls-tls13-13
- [10] SSL and TLS Protocols https://wiki.openssl.org/index.php/SSL_and_TLS_Protocols