**一、协议理解: **
*(一)握手过程(Handshake)***: **
握手是 TLS 连接的起始阶段,用于建立安全的通信通道。握手过程包括以下主要步骤:
1、客户端发送 ClientHello 消息:客户端向服务器发送包含支持的 TLS 版本、加密套件列表和
随机数的消息。
2、服务器回应 ServerHello 消息:服务器从客户端提供的 TLS 版本和加密套件列表中选择一
个,并回复包含所选 TLS 版本、加密套件、服务器证书(可选)和随机数的消息。
3、服务器认证(Certificate):如果需要服务器认证,服务器会发送包含数字证书的
Certificate 消息给客户端。客户端验证证书的有效性和可信性。
4、密钥交换(Key Exchange):双方协商会话密钥的生成方式。这可以通过 RSA 密钥交
换、DH(Diffie-Hellman)密钥交换或 ECDH(Elliptic Curve Diffie-Hellman)密钥交换等方
式完成。
5、完成握手(Finish):握手过程最后阶段,双方会发送 Finished 消息以验证握手的成功完
成。
**(二)密钥交换(Key Exchange): **
在 TLS 握手过程中,密钥交换是非常关键的步骤,它决定了后续通信所使用的对称密
钥。TLS 支持多种密钥交换算法,包括:
1、RSA 密钥交换:服务器使用其私钥对随机生成的会话密钥进行加密,并将其发送给客户端。
2、DH(Diffie-Hellman)密钥交换:客户端和服务器通过一系列数学运算交换公钥,最终双方
都获得了相同的对称密钥。
3、ECDH(Elliptic Curve Diffie-Hellman)密钥交换:与 DH 密钥交换类似,但使用的是椭圆
曲线密码学。
**(三)加密算法的选择: **
在握手过程中,客户端和服务器会协商选择一种加密套件,其中包括对称加密算法、密钥交换算
法、摘要算法等。TLS 支持的加密套件通常包括 AES、RSA、ECDSA、SHA 等。
**(四)认证(Authentication): **
TLS 使用数字证书来进行认证,确保通信双方的身份是可信的。服务器通常需要提供数字证书,
客户端可以验证证书的有效性和服务器的身份。可选的客户端认证也可以通过客户端证书实现。**(五)通信的保护: **
完成握手后,TLS 连接进入安全通信阶段。在此阶段,通信数据将通过选定的加密算法进行加
密,并通过消息认证码(MAC)来保证数据的完整性。这确保了通信数据在传输过程中不会被窃
听、篡改或伪造。
**二、实验环境搭建: **
**(一)openssl 的安装 **
1、进入 openssl 的官网未提供 openssl 的安装包,我选择了其他的网站,直接安装 openssl 的
安装包,这样就会很方便,省去了很多在 openssl 官网安装的步骤(实在是麻烦至极)
2、找到安装的地址,将其添加到 path 环境变量中
3、生成证书和私钥:在 TLS 连接中,服务器通常需要一个数字证书来进行身份验证。可以使用
OpenSSL 来生成自签名证书和私钥。使用以下命令生成证书和私钥文件,然后有一些国家、地区
的信息我是直接回车键直接跳过的。
**(二)wireshark 的安装 **
1、在官网下载 wireshark
2、双击安装包,进行安装
**(三)在完成安装 openssl 和 wireshark 之后,开始正式操作 **
1、启动 TLS 服务器,打开命令行窗口。使用 OpenSSL 启动一个简单的 TLS 服务器:
2、建立 TSL 连接,使用 OpenSSL 启动一个 TLS 客户端,并连接到刚刚启动的服务器
3、使用 Wireshark 捕获 TLS 通信数据包。打开 Wireshark。在 Wireshark 主界面的网络接口
列表中选择要捕获流量的网络接口,加入过滤器,添加过滤器可以帮助更快地找到和分析与
TLS 相关的数据包。
按钮开始捕获流量。
4 分析 TLS 握手过程
① Client Hello
握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的
随机数 Random1、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息。
协议版本(Version):从数据包中可以看到,TLS 客户端支持的协议版本是 TLS 1.2。这可以从 "Version" 字段中的数值 0x0303 推断出来。
支持的加密套件列表(Cipher Suites):在数据包中的 "Cipher Suites" 字段列出了客户端
支持的加密套件列表。这些套件用于在握手期间进行协商,以确定客户端和服务器之间的加密算
法。在这个数据包中,客户端支持的加密套件有以下 19 种:
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca9)
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca8)
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)
TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)
TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d)
TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)
TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (0xc012)
TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)
TLS_AES_128_GCM_SHA256 (0x1301)
TLS_AES_256_GCM_SHA384 (0x1302)
TLS_CHACHA20_POLY1305_SHA256 (0x1303)
随机数(Random):在数据包中的 "Random" 字段包含了一个随机生成的值,用于在握手期间
生成密钥。这个随机数由 GMT Unix 时间戳和一串随机字节组成。
② Server Hello
第二步是服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的
Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。注意,至此客户端和服务端都拥有了两个随机数
(Random1+ Random2),这两个随机数会在后续生成对称秘钥时用到。
可分析出服务器选择的 TLS 版本是 TLS 1.2。加密套件是
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
③ Certificate
这一步是服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取
出证书中的公钥。
④ Server Key Exchange
如果是 DH 算法,这里发送服务器使用的 DH 参数。RSA 算法不需要这一步。
⑤ Certificate Request
由 OpenSSL 官方文档知,Certificate Request 是服务端要求客户端上报证书,这一步是可选
的,对于安全性要求高的场景才会用到。
⑥ Server Hello Done
Server Hello Done 通知客户端 Server Hello 过程结束。
⑦ Certificate Verify
客户端收到服务端传来的证书后,先从 CA 验证该证书的合法性,验证通过后取出证书中的服务端公钥,再生成一个随机数 Random3,再用服务端公钥非对称加密 Random3 生成 PreMaster
Key。
⑧ Client Key Exchange
上面客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个
key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的
Random3。至此,客户端和服务端都拥有 Random1 + Random2 + Random3,两边再根据同样的算
法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密
⑨ Change Cipher Spec(Client)
这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事
件消息。
⑩ Encrypted Handshake Message(Client)
这一步对应的是 Client Finish 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加
密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出
来的秘钥是一致的。
Change Cipher Spec(Server)
这一步是服务端通知客户端后面再发送的消息都会使用加密,也是一条事件消息。
Encrypted Handshake Message(Server)
这一步对应的是 Server Finish 消息,服务端也会将握手过程的消息生成摘要再用秘钥加密,
这是服务端发出的第一条加密消息。客户端接收后会用秘钥解密,能解出来说明协商的秘钥是一
致的。
**三、安全性评估: **
(一)TLS 对于中间人攻击、重放攻击、密码破解攻击等)的防范能力①中间人攻击(MITM):
防范原理:
TLS 使用数字证书来验证服务器的身份。服务器在握手过程中向客户端发送证书,证书中包含服
务器的公钥和相关信息,同时由可信任的证书颁发机构(CA)签名。客户端使用事先内置的信任
根证书或可信任的 CA 列表来验证服务器证书的有效性。如果证书验证失败或证书不受信任,则
客户端会警告用户或直接中止连接。
防范效果:
通过数字证书验证机制,TLS 能够防止中间人攻击。即使攻击者截获了通信并尝试伪造服务器身
份,但由于无法提供有效的数字证书,客户端会拒绝建立连接,从而保护通信的安全性。TLS 的
数字证书验证机制基于公钥基础设施(PKI),它建立在信任的根证书颁发机构(CA)之上。CA
负责验证服务器的身份,并签发数字证书。因此,TLS 防止了中间人攻击,前提是客户端和服务
器信任 CA,并能够正确验证证书。部署严格的证书验证策略可以进一步提高防范中间人攻击的
效果。例如,客户端可以只信任特定的 CA,或者进行额外的证书验证,如证书撤销检查(CRL)
或在线证书状态协议(OCSP)验证。
②重放攻击(Replay Attack):
防范原理:
TLS 在握手过程中使用随机数和时间戳来防止重放攻击。客户端和服务器在每次握手时都会生成
随机数,并将其包含在握手消息中。攻击者无法预测下一个有效的随机数,因此无法重放先前捕
获的通信数据。此外,TLS 还使用时间戳来确保握手消息的时效性,防止过期的握手消息被重
放。
防范效果:
通过随机数和时间戳的使用,TLS 有效地防止了重放攻击。即使攻击者拦截了通信并尝试重放先
前的握手消息,但由于无法重复生成有效的随机数和时间戳,服务器将拒绝建立连接。TLS 使用
随机数和时间戳来确保通信的唯一性和时效性。随机数在每次握手过程中都是唯一的,而时间戳
确保握手消息的有效期有限。
客户端和服务器都会检查握手消息中的时间戳,如果时间戳过期,将拒绝握手请求。这确保了攻
击者无法重放过期的握手消息。
③密码破解攻击(Cryptanalysis):
防范原理:
TLS 使用先进的加密算法和密钥交换协议来保护通信的机密性和完整性。例如,TLS 支持使用
AES、RSA、ECDHE 等安全性高的加密算法,以及 Diffie-Hellman 密钥交换协议等。此外,TLS 还支
持密钥长度的灵活配置,通常建议使用 128 位以上的对称密钥和 2048 位以上的 RSA 密钥来提高
安全性。
防范效果:
通过采用安全性高的加密算法和密钥长度,TLS 能够有效地抵御密码破解攻击。即使攻击者拦截
了通信并尝试对加密数据进行解密,由于加密算法和密钥的安全性,破解的难度非常高,从而保护了通信的安全性和机密性。TLS 采用安全性高的加密算法和密钥长度,使得密码破解攻击变
得极为困难。例如,AES-256 位加密算法提供了足够的强度来抵御暴力破解攻击。此外,TLS 还支
持完善的密钥协商机制,如基于 ECDHE 的密钥交换协议,它能够确保每次通信都使用独特的会
话密钥,从而增加了密码破解攻击的难度。
总结评估安全性:TLS 不仅在协议层面上提供了防范各种攻击的机制,还通过严格的证书验证、
唯一的随机数和时效性的时间戳以及安全性高的加密算法和密钥长度等措施,进一步增强了对
中间人攻击、重放攻击和密码破解攻击等安全威胁的防范效果。
**(二)调研 TLS 的安全特性和安全漏洞,并提出改进建议 **
通过调研多个网站,我发现了以下多个 TLS 的安全特性及安全漏洞,并给予了自己的拙
见,望有所获。
① SSL/TLS (BEAST)攻击
针对 SSL/TLS (BEAST)攻击的浏览器漏洞于 2011 年 9 月披露。它适用于 SSL 3.0 和
TLS 1.0,因此会影响支持 TLS 1.0 或更早版本协议的浏览器。攻击者可以利用 TLS 1.0 中实
现密码块链 (CBC) 模式中的漏洞来解密两方之间交换的数据。BEAST 漏洞在 NIST NVD 数据
库中注册为 CVE-2011-3389。
这是一种使用中间人技术的客户端攻击。攻击者使用 MITM 将数据包注入 TLS 流。这允许他们
猜测用于注入消息的初始化向量 (IV),然后简单地将结果与他们想要解密的块的结果进行比
较。要使 BEAST 攻击成功,攻击者必须对受害者的浏览器有一定的控制权[1]。
以下是野兽攻击的详细解释:
改进建议:此前各大公司都认为缓解 BEAST 攻击的方法之一是使用 RC4 密码。然而,RC4 加密
协议后来被发现不安全。PCI DSS(支付卡行业数据安全标准)禁止使用此密码,Microsoft 还强烈建议不要在 Windows 中使用它
。
我的改进建议是:使用 TLS 1.1 或 TLS 1.2。因为在 TLS1.0 中这种攻击仍未被解
决,若您使用的是 TLS1.1 或更新的版本就可以避免这种攻击
② Compression Ratio Info-leak Made Easy (CRIME) 漏洞攻击
Compression Ratio Info-leak Made Easy (CRIME) 漏洞会影响 TLS 压缩。压缩方法包
含在客户端 Hello 消息中,并且是可选的。您可以在不压缩的情况下建立连接。SSL/TLS 引入
了压缩以减少带宽。DEFLATE 是最常用的压缩算法。CRIME 漏洞在 NIST NVD 数据库中注册
为 CVE-2012-4929[2]。
这是 Wireshark 捕获的 Server Hello 消息(对 Client Hello 的响应)。服务器选
择 NULL 压缩方法,这意味着不会使用压缩。
假设攻击者想要获取受害者的 cookie。他们知道目标网站 (examplebank.com) 为名
为 adm 的会话创建一个 cookie。 攻击者知道 DEFLATE 压缩方法会替换重复的字节。因此,
攻击者会注入受害者的 cookie。服务器将仅附加到压缩的响应中,因为已经在受害者的 cookie
中发送,因此会重复。
以下是这种攻击的图解:
使用此方法,攻击者可以使用他们从服务器获得的反馈来重建 cookie 值。
改进建议:将您的浏览器升级到最新版本
③漏洞攻击
通过超文本自适应压缩 (BREACH) 漏洞的浏览器侦测和外泄漏洞与 CRIME 非常相似,但
BREACH 针对的是 HTTP 压缩,而不是 TLS 压缩。即使关闭了 TLS 压缩,这种攻击也是可能
的。攻击者强制受害者的浏览器连接到启用了 TLS 的第三方网站,并使用中间人攻击来监控受
害者与服务器之间的流量。BREACH 漏洞在 NIST NVD 数据库中注册为 CVE-2013-3587。
易受攻击的 Web 应用程序满足以下条件:
从使用 HTTP 级压缩的服务器提供
在 HTTP 响应正文中反映用户输入
在 HTTP 响应正文中反映机密(例如 CSRF 令牌)(因此 HTTP 标头中的值(例如
Cookie)可以免受此攻击)。改进建议:禁用 HTTP 压缩,将机密与用户输入分开,随机化每个请求的机密,屏蔽密钥(通
过对每个请求的随机密钥进行异或操作,从而有效地随机化),保护页面免受 CSRF 的侵害,
隐藏长度(通过向响应添加随机字节数),限制请求速率
**四、加密套件分析 **
**(一)套件组成 **
①对称加密算法:
对称加密算法用于在通信双方之间保护数据的机密性。常见的对称加密算法包括 AES(高级
加密标准)、DES(数据加密标准)和 3DES(Triple DES)等。在 TLS 中,AES 是最常用的对称加
密算法,由于其安全性高、性能优越,特别是 AES-GCM 模式,因其同时提供了加密和认证功能而
备受青睐。
选择对称加密算法时,需要考虑其安全性、性能和硬件支持情况。AES 是目前最受推荐的对
称加密算法之一,可以提供强大的安全性和高效的性能。
②非对称加密算法:
非对称加密算法用于在通信双方之间安全地交换对称密钥,以便建立加密通道。常见的非对
称加密算法包括 RSA(Rivest-Shamir-Adleman)、DSA(数字签名算法)和 ECC(椭圆曲线加
密)等。在 TLS 中,RSA 和 ECC 是最常用的非对称加密算法,它们用于建立安全通信的初始密钥
交换。
选择非对称加密算法时,需要考虑其安全性、密钥长度和性能。ECC 由于其相对较短的密钥
长度和高强度的安全性而成为 TLS 中的首选算法之一,特别是在移动设备和资源受限环境下。
③哈希函数:
哈希函数用于计算消息的摘要,以验证消息的完整性和真实性。在 TLS 中,常用的哈希函数
包括 SHA-256(安全哈希算法-256 位)和 SHA-384 等。这些哈希函数通常与 MAC 算法和数字签名
算法结合使用,以确保通信数据的安全性。
选择哈希函数时,需要考虑其安全性和性能。SHA-256 是目前最常用的哈希函数之一,提供了较高的安全性和良好的性能。
综上所述,TLS 协议中使用的加密套件需要综合考虑安全性、性能和适用性等因素。对称加密算
法、非对称加密算法、MAC 算法和哈希函数的选择应根据具体的应用场景和安全要求来确定,以
确保通信数据的保密性、完整性和真实性。
**(二)并评估其在实际应用中的适用性 **
①对称加密算法:
适用性:对称加密算法适用于需要快速加密和解密大量数据的场景,例如数据传输、数据存
储等。由于对称加密算法的加密和解密速度通常较快,因此在对性能要求较高的环境中广泛应
用。
优势:速度快,加密和解密效率高;适合大规模数据加密;实现相对简单,计算成本低。
劣势:密钥管理相对困难,需要安全地传输密钥;不适用于密钥交换和数字签名等场景。
②非对称加密算法:
适用性:非对称加密算法适用于需要安全地进行密钥交换和数字签名等场景,例如 SSL/
TLS 握手过程、数字证书颁发等。由于非对称加密算法具有公钥和私钥两个密钥,因此适用于解
决密钥分发和管理的问题。
优势:安全性高,适用于密钥交换和数字签名等场景;无需安全传输密钥。
劣势:加密和解密速度较慢,性能较对称加密算法差;密钥长度较长,占用资源较多。
③哈希函数:
适用性:哈希函数适用于验证数据的完整性、生成消息摘要、实现数字签名等场景。哈希函
数可以将任意长度的输入数据映射为固定长度的哈希值,因此适用于生成唯一的标识符,并可
用于验证数据的完整性。
优势:快速计算哈希值;哈希值唯一性高,碰撞概率低;适用于验证数据完整性和生成消
息摘要。
劣势:不可逆性,无法从哈希值还原原始数据;哈希碰撞可能性存在,虽然概率很低但不
可忽视。
在实际应用中,对称加密算法、非对称加密算法和哈希函数常常结合使用,以充分利用它们
各自的优势,并弥补彼此的不足。例如,在 SSL/TLS 握手过程中,对称加密算法用于加密数据传
输的效率要求,非对称加密算法用于密钥交换和数字签名的安全要求,哈希函数用于生成消息
摘要验证数据的完整性。
版权归原作者 小杨勇敢飞 所有, 如有侵权,请联系我们删除。