HTTPS、SSL、TLS的关系
发现地点
其实最开始并不了解,只是有一次被 DDoS 时偶然发现了 Cloudflare 的这个功能,于是便好奇了解了一点。
Cloudflare 面板里有不少 SSL/TLS 相关的选项,它的几种加密模式区别就在回源站这一段:Flexible 回源走 HTTP,Full 回源走 HTTPS 但不校验证书,Full (strict) 才要求源站证书合法有效。
SSL、TLS简介
SSL(Secure Socket Layer,安全套接层)夹在 HTTP 之下、TCP 之上,负责给 HTTP 传输的数据加密。它是一项标准技术,能确保互联网连接安全,保护两个系统之间发送的敏感数据——这两个系统可能是服务器和客户端,也可能是两台服务器。原本 HTTP 的报文在公网上就是明文跑的,谁在中间抓一下都能看全,套上 SSL 之后抓到的就只是一串看不懂的密文。
具体做法是混合加密:真正传数据用对称加密(比如 AES),因为对称加密快;而对称密钥怎么安全地交到对方手里,就靠非对称加密和密钥交换算法来解决——服务器证书里带着公钥,双方在握手阶段协商出一份只有彼此知道的会话密钥。再加上数字签名和证书链校验,身份确认和数据完整性也一并有了保障。
TLS(Transport Layer Security,传输层安全)是 SSL 的升级版,也更安全。由于 SSL 这个叫法更常用,大家还是习惯把安全证书称作 SSL 证书,实际上买到的都是 TLS 证书,密钥类型有 ECC、RSA 或 DSA 三种可选。ECC 的密钥更短、握手更快,同等安全强度下比 RSA 省资源,现在新签的证书基本都优先选它。另外提一句:SSL 3.0 在 2015 年就被正式弃用了(RFC 7568),现在实际在用的基本都是 TLS 1.2 或 1.3。
HTTPS 就是套了 TLS/SSL 的 HTTP,默认跑在 443 端口,而不是 80(端口换成别的也照样能用,端口号本身不是关键,真正起作用的是外面那层加密通道)。HTTPS 在发送端加密、接收端解密,解密用的对称密钥靠双方在握手阶段协商出来,所以数据被截获也看不懂,自然更安全。浏览器地址栏里那把锁,就是证书校验通过之后亮起来的;要是换成自签证书或者证书过期,浏览器会直接拦下来,给一个醒目的警告页。
TLS/SSL 是加密通道的规范:它用对称加密传数据,用非对称加密和密钥交换算法协商密钥,再靠 CA 体系确认双方身份,从而做到可信的信息传输。CA 体系简单讲就是浏览器和操作系统里预装了一批根证书,服务器证书由这些根(或者根签发的中间证书)签名,验签一路往上能追到根,才会被认可;证书里还绑定了域名,域名对不上的证书同样会被拒绝。
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。
记录协议管的是每一包数据怎么加密、怎么校验,握手协议管的是开传之前双方怎么互相确认、怎么把密钥谈出来。拿 TLS 1.2 举例,握手大致是:客户端先把自己支持的版本、加密套件列表和一个随机数发过去(ClientHello);服务器回一个选定的版本、套件和自己的随机数,附上证书(ServerHello);客户端验完证书后,用服务器公钥加密一份 pre-master secret 发过去,或者双方用 ECDHE 各自算出共享密钥;接着两边用这几个随机数一起推出会话密钥(master secret),各发一条 Finished 确认握手没被篡改;之后所有数据就都走记录协议,用会话密钥做对称加密了。TLS 1.3 把 RSA 密钥交换砍掉了,只留 ECDHE 这类带前向保密的算法,握手也从两次往返缩到一次。前向保密的意思是,以后就算服务器私钥泄漏,之前抓到的包也解不开,因为会话密钥压根没经过私钥传输。
SSL、TLS的区别
SSL:(Secure Socket Layer,安全套接层),位于可靠的、面向连接的传输层协议(如 TCP)和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport Layer Security,传输层安全协议),用于在两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
1)报文鉴别码:SSLv3.0和TLS的MAC算法及MAC计算的范围不同。TLS使用RFC-2104定义的HMAC算法。SSLv3.0使用了相似的算法,两者差别在于SSLv3.0中,填充字节与密钥之间采用的是拼接运算,而HMAC算法采用的异或运算。但是两者的安全程度是相同的。
2)伪随机函数:TLS使用了称为PRF的伪随机函数来将密钥扩展成数据块,是更安全的方式。SSLv3.0 是把 MD5 和 SHA-1 的结果简单拼起来用,TLS 的 PRF 换成了两路 HMAC 异或的结构,输入划分得更清楚,攻击者能钻的空子更少。
3)报警代码:TLS支持几乎所有的SSLv3.0报警代码,而且TLS还补充定义了很多报警代码,如解密失败(decryption_failed)、记录溢出(record_overflow)、未知CA(unknown_ca)、拒绝访问(access_denied)等。报警是协议层的错误通知,握手失败或者解密出问题时,双方会互发一条说明原因,排错的时候看一眼报警码就能大致定位。
4)密文族和客户证书:SSLv3.0和TLS存在少量差别,即TLS不支持Fortezza密钥交换、加密算法和客户证书。Fortezza 是美国当年那套 Clipper 芯片配套的加密方案,TLS 直接把它去掉了。
5)certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息计算MD5和SHA-1散列码时,计算的输入有少许差别,但安全性相当。
6)加密计算:TLS和SSLv3.0在计算主密钥(master secret)时采用的方式不同,SSLv3.0 直接拿 MD5 和 SHA-1 拼出主密钥,TLS 则走前面说的 PRF,安全性更高。
7)填充:用户数据加密之前需要增加的填充字节。在SSL中,填充后的数据长度要达到密文块长度的最小整数倍。而在TLS中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析的攻击。道理也简单:攻击者虽然解不开内容,但光看每个包的长度也能猜出一些信息,比如登录密码有几位;TLS 允许自由填充,这种长度特征就被抹掉了。
8)版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。记录格式一样、版本号却错位,是当年为了和 SSL 3.0 区分开留下的习惯:0x0300 是 SSL 3.0,0x0301 就成了 TLS 1.0,抓包看到这个不用惊讶。
TLS的优势
1、更安全的MAC算法、更严密的警报
2、对于消息认证使用密钥散列法:TLS使用“消息认证代码的密钥散列法”(HMAC),当记录在开放的网络(如因特网)上传送时,该代码确保记录不会被变更。SSLv3.0 也提供带密钥的消息认证,但 HMAC 比 SSLv3.0 用的 MAC(消息认证代码)更安全。
3、增强的伪随机功能(PRF):PRF生成密钥数据。在TLS中,HMAC定义PRF。PRF使用两种散列算法保证其安全性。如果其中一种算法被攻破了,只要第二种还没被攻破,数据就仍然是安全的。
4、改进的已完成消息验证:TLS和SSLv3.0都对两个端点提供已完成的消息,该消息用于证明交换的内容没有被变更。然而,TLS把这个已完成消息建立在PRF和HMAC值之上,这也比SSLv3.0更安全。
5、一致证书处理:与SSLv3.0不同,TLS尝试规定通信双方必须支持的证书类型。
6、特定警报消息:TLS提供更多的特定和附加警报,以指示任一会话端点检测到的问题。TLS还对何时应该发送某些警报进行记录。
文章摘自:https://blog.csdn.net/whatday/article/details/102369732/
总结
TLS 是 SSL 的升级换代,HTTPS 就是套了 TLS 的 HTTP,证书、握手、密钥这一串概念落到实际也就三步:先验身份,再换钥匙,最后用钥匙加密聊天。这次是从 Cloudflare 面板上的几个选项倒推回去的,日常建站把证书挂上、能让浏览器出小锁就够用,想再往下挖的话,自己抓一次包,把整个握手过程看一遍就很直观。