一、前言
最近工作中有一项任务需要把两个系统的集成方式从http升级到https,并且要求TLS版本至少为TLS 1.2。
其中一个系统使用的是一个开源组件和另一个系统进行集成的,这个开源组件到目前(2023年)已经有8年没有维护了。
不知道是供应商的技术能力有问题,还是这个组件本身的问题,老系统就是没法和另一个系统成功建立https (TLS 1.2)连接,最后问题卡在了Cipher Suite不匹配,最后供应商给出的方案是使用他们一个新的商业的EDI进行集成。
这个问题问题从最开始分析到最终成功上线,历时将近半年的时间;一个比较简单的问题,为何会历经这么久的时间?
这里面除了技术问题,最主要的是项目管理问题。本文主要从技术基础知识总结一下,很重要的管理问题后续单独写一篇文章进行总结。
本文先主要记录整理TLS协议相关的背景和基础知识,再进一步学习TLS协议和Cipher Suite的工作原理,最后通过Wiresharp抓包实践并验证其工作原理。由于至目前(2023年)主流使用的TLS协议是1.2,最新版本是1.3,所以本文主要针对TSL 1.2和1.3两个版本进行学习和总结。
由于本人对密码学了解甚少,以免误人误己,文中只列出相关算法和及其作用,不深入分析算法。
二、SSL协议简介
在具体学习TLS协议之前,我们先大概的了解一下TLS协议的前任SSL协议的历史。
SSL(Secure Sockets Layer)是一种用于加密网络通信的安全协议。它的历史可以追溯到1990年代早期,最初由网景公司开发,后来成为互联网上保护数据传输安全性的标准协议。SSL的发展主要经历了3个版本的演变。
2.1 SSL 1.0
SSL 1.0是最早的SSL版本,但由于存在严重的安全漏洞,从未正式发布。
2.2 SSL 2.0
SSL 2.0于1995年发布,成为广泛使用的加密协议。它引入了对称加密、非对称加密和消息认证码等加密技术,为数据传输提供了基本的保护。然而,SSL 2.0存在多个安全漏洞,已被广泛废弃,不再被推荐使用。
2.3 SSL 3.0
SSL 3.0于1996年发布,对SSL 2.0进行了改进和修复。SSL 3.0在握手协议、加密算法和数据完整性方面进行了改进,提供了更强的安全性。然而,在2014年,SSL 3.0暴露出POODLE(Padding Oracle On Downgraded Legacy Encryption)漏洞,使得SSL 3.0不再安全,被废弃。
随着SSL的发展,其逐渐演变为TLS(Transport Layer Security),TLS是SSL的继任者,用于更安全的加密通信。
三、TLS协议简介
TLS代表传输层安全性(Transport Layer Security)。在TCP/IP协议簇中,它是一种介于应用层(如Http)和传输层(TCP)之间的加密协议,用于保护在网络上发送的数据,例如互联网流量。至于具体属于应用层还是传输层,这个咱不纠结。现实中大量使用的基于TLS的应用层协议是Https。
TLS保护数据的传输和交付,它不会保护端点的数据,也不会对数据进行加密。
TLS是SSL的继任者,TLS的发展历史:
3.1 TLS 1.0
在1999年发布,基于SSL 3.0进行了一些改进,修复了一些安全问题,并提供了更强的加密和认证机制。TLS 1.0仍然广泛应用于互联网上的许多服务和应用。
3.2 TLS 1.1
在2006年发布,进一步改进了协议的安全性和效率,并增加了新的加密算法。TLS 1.1在TLS 1.0的基础上提供了一些增强功能,但并不是一个重大的协议版本更新。
3.3 TLS 1.2
在2008年发布,引入了更多的加密算法和安全特性,提供了更强的安全性和性能。TLS 1.2支持更多的密码套件,提供了更高级的加密算法和密钥交换方法。
RFC: RFC 5246
3.4 TLS 1.3
在2018年发布,是TLS的最新版本。TLS 1.3对协议进行了全面简化,并删除了一些不安全的选项和算法。它提供了更快的握手过程、更强的安全性和隐私保护。
RFC: RFC 8446
3.5 TLS协议的主要功能特性
- 加密(Encryption) – 对两个通信方之间传输的数据进行隐藏,通常是客户端服务器和Web应用程序之间的通信。这可以防止窃听。
- 身份验证(Authentication) – 对在互联网上进行通信的两个方的身份进行认证。这可以防止冒充攻击。
- 完整性(Integrity)- 验证在网络上发送的数据在传输过程中没有被篡改。这可以防止中间人攻击。使用由受信任的证书颁发机构(CA)颁发的证书来确保完整性。
- 重放攻击防护(Replay Prevention)- 这可以防止暴力破解攻击和中间人攻击。
3.6 TLS协议的主要应用场景
- 安全的网站通信:TLS被广泛用于保护网站与用户之间的通信。当用户访问一个使用TLS加密的网站时,TLS将确保通信的保密性和完整性,防止第三方窃听、篡改或伪造数据。
- 电子邮件安全:TLS也可用于保护电子邮件的传输。当电子邮件客户端和邮件服务器之间建立TLS连接时,邮件内容将以加密方式传输,从而确保邮件的机密性。
- 虚拟专用网络(VPN):许多VPN服务提供商使用TLS来建立安全的VPN连接。TLS用于加密VPN客户端和服务器之间的通信,以保护用户的隐私和数据安全。
- 移动应用程序安全:许多移动应用程序使用TLS来保护与后端服务器之间的通信。这确保了移动应用程序与服务器之间的数据传输是安全的,并防止敏感信息在传输过程中被窃听或篡改。
- 云服务安全:云服务提供商通常使用TLS来保护客户与云服务器之间的通信。这样可以确保在云环境中传输的数据是安全的,并防止未经授权的访问和数据泄露。
- ……
3.7 其他网络安全通信协议
除了TLS协议,还有其他的网络通信协议可以用于保护数据的安全性。以下是一些常见的网络通信协议:
- IPSec(Internet Protocol Security):IPSec是一种用于保护IP层通信的协议,可以提供机密性、完整性和身份验证等安全保护。IPSec可以用于VPN、远程访问和站点到站点通信等场景。
- SSH(Secure Shell):SSH是一种用于保护远程访问和文件传输的协议,可以提供加密、身份验证和数据完整性保护。SSH通常用于远程管理服务器、远程登录和文件传输等场景。
- SFTP(Secure File Transfer Protocol):SFTP是一种用于保护文件传输的协议,可以提供加密、身份验证和数据完整性保护。SFTP通常用于安全地上传和下载文件。
- PGP(Pretty Good Privacy):PGP是一种用于保护电子邮件和文件的协议,可以提供加密和数字签名等安全保护。PGP通常用于保护敏感信息的传输和存储。
- SSL(Secure Sockets Layer):SSL是TLS的前身,也是一种用于保护网络通信的协议。虽然现在已经被TLS取代,但仍然有一些应用程序在使用SSL协议。
说到SSL/TLS协议,就不得不说Cipher Suite。
四、Cipher Suite简介
Cipher Suite(密码套件)是在TLS协议中用于加密和认证通信的一组加密算法和协议参数的集合。它定义了在TLS握手过程中使用的加密算法、密钥交换算法、数字签名算法和消息认证码算法等。
在TLS握手过程中,客户端和服务器通过协商选择一个适当的Cipher Suite来确定加密和认证参数。双方将根据安全策略和支持的算法来选择最合适的Cipher Suite。一旦Cipher Suite确定,通信双方将使用该套件中定义的加密算法和协议参数来保证通信的机密性、完整性和身份认证。
Cipher Suite的选择对于安全通信至关重要。安全性强大的Cipher Suite应该使用先进的加密算法和密钥交换算法,并提供足够强大的消息认证码和数字签名算法来保护通信。同时,Cipher Suite的选择也应考虑到性能和兼容性因素,以确保通信的效率和可靠性。
4.1 Cipher Suite的组成结构
Cipher Suite通常显示为一长串看似随机的信息,但该字符串的每个部分都包含重要信息。通常,这个数据字符串由几个关键组件组成:
- 协议(例如TLS 1.2或TLS 1.3)
- 密钥交换或协商算法
- 数字签名(身份验证)算法
- 批量加密算法
- 消息认证码算法(MAC)
在密码学领域,密码是用于加密和解密数据的程序,所有这些算法都支持多种密码。密码定义了加密和解密过程中要执行的详细步骤。
4.2 TLS 1.2和TLS 1.3的Cipher Suite
Cipher Suite是在称为TLS握手(以前称为SSL握手)的过程中交换的。在TLS握手中,客户端将发送一个ClientHello消息,其中包含它支持的所有算法。服务器将返回ServerHello和它从客户端算法列表中支持的算法。
在双方进行安全连接之前,服务器会从客户端列提供的列表中选择将要使用的Cipher Suite。如果两个参与方没有共同的Cipher Suite,服务器将立即中止连接。
还值得注意的是,TLS 1.2密码套件不能与TLS 1.3连接进行协商,反之亦然。
密码套件中有四种算法。每个角色在建立安全、加密的连接时都扮演着不同的角色。客户端和服务器可以根据它们使用的 SSL/TLS 版本支持不同的密码套件。许多公司还对通信所需的最低加密强度制定了具体政策。因此,基于所有这些因素,客户端和服务器就使用特定的密码套件达成一致。
TLS 1.2 Cipher Suite示例:
TLS 1.3 Cipher Suite示例:
4.3 对称加密和非对称加密算法简介
最基本的加密算法有两种类型:对称和非对称。在对称加密中,使用相同的密钥来加密和解密数据。使用非对称加密,使用不同的密钥来加密(公钥)和解密(私钥)数据。SSL/TLS 证书使用非对称加密,使用单独的密钥进行加密和解密,建立数据交换的安全通道。之后,它们切换到对称连接。
使用对称加密,双方使用共享密钥
对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。常见的对称加密算法有AES、DES等。
对称加密算法缺点主要是:
- 共享密钥的传输,如何安全传输共享密钥是一个问题
- 对于互联网应用,一个服务端会有非常多个客户端,不管每个客户端之间使用相同还是不同的共享密钥,两个方式都会有很多问题。
使用非对称密钥加密,一方(客户端)使用公钥进行加密,另一方(服务器端)使用私钥对数据进行解密
由于对称加密的密钥传输和管理具有安全风险,非对称加密方法可以解决该问题。
非对称加密还具有验签的功能,通过私钥/公钥加密的内容,如果可以在另一方通过公钥/私钥解密,说明验签通过。实际情况通过HASH算法给要传输的内容进行HASH计算生成摘要,摘要和内容一起加密传输;接收方解密摘要和正文内容后,对正文内容进行同样的HASH计算生成摘要,并对比计算后的摘要与传过来的摘要是否相同,就可判断内容是否被篡改。
非对称加密的数据加解密相当耗时,通过这种加密方式传输数据会影响效率。
对称加密和非对称加密相结合的方式
TLS本身是一个混合加密系统,也就是说它使用了对称加密和非对称加密两种方式。
这样通信的原因是因为非对称加密虽然很安全,但是效率实在是太低了(比对称加密慢几个数量级),因此只用来传输对称加密的密钥,之后就使用效率更高的对称加密来通信。
- 服务端生成非对称秘钥对,私钥自己保存,将公钥明文传输给客户端;
- 客户端生成一个对称秘钥,再将对称秘钥使用收到的公钥进行加密,将加密后的秘钥传送给服务端;
- 这样双端都持有相同的对称秘钥,之后的数据就通过该秘钥进行加密再传输。
TLS协议就是实现了这一过程安全协议。TLS是在TCP之上,应用层之下实现的网络安全方案;UDP则使用DTLS协议实现安全传输,和TLS协议类似。
五、数字证书
非对称加密算法也不是完全安全的,因为公钥的持有方无法验证拿到的公钥是否是真实的。举个例子:A拥有私钥 + 公钥并提供公钥给到B进行安全通信;但是黑客C有机会偷偷的把B拿到的公钥换成自己的公钥,伪装成A和B进行通信。
数字证书可以解决该问题,A找到“证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对A的公钥和一些相关信息一起加密,生成“数字证书”(Digital Certificate)。
A拿到数字证书(私钥+公钥)后,自己使用私钥,并把公钥提供给B进行安全通信;B拿到的公钥是经过认证的,就可以放心使用了。