一文读懂https
http和https的关系
http,应用层协议,由于采用明文传输,不安全,还有很多其他安全问题,为此就衍生出了同为应用层协议的https。https在http的基础上引入了SSL(Secure Socket Layer 安全套接层)和 TLS(Transport Layer Security 安全传输层协议)。SSL介于传输层和应用层之间,TLS在OSI七层模型中属于会话层,而在TCP/IP四层模型中有的认为属于应用层,有的认为属于传输层,技术实现上,TLS也介于传输层与应用层之间,既依赖传输层(如TCP)建立连接,又为应用层协议提供安全服务。
SSL 最初由网景公司(Netscape)开发,用于在万维网中提供安全的通信,随着网络安全需求的不断提高以及 SSL 协议自身存在的一些安全漏洞,IETF(互联网工程任务组)在 SSL 3.0 的基础上进行了改进和标准化,推出了 TLS 协议。也就是说,目前实际上采用的是TLS协议,我们只需重点关注TLS即可。http+TLS=https。
一些基础概念
对称加密:加密和解密使用的是同一个密钥。也叫共享密钥加密。
非对称加密:加密和解密使用不同的密钥,例如发送方使用公开密钥加密,接收方使用私有密钥解密。也叫公开密钥加密。
数字签名:类似于手写签名,可以简单理解为一种防伪手段。
TLS的工作流程
想要确保发送的内容安全,大家首先想到的估计都是加密。只要将内容加密(http采用明文传输,没有加密),其他人就不知道了,那么问题就来了:网络上双方常常相隔千里,怎样统一加密方法?互通加密方法时又怎样保证加密方法的安全?怎样确保传输的内容不会被中途截取?发送方和接收方怎样确认对方就是自己想互通的人?这些就是TLS要解决的问题。
身份认证
数字证书认证机构是处于客户端和服务器之间双方都信任的第三方机构。服务器的运营人员向数字证书认证机构提交公开密钥,机构用自己的私有密钥对该公开密钥做数字签名,然后将该已签名的公开密钥放入公钥证书。客户端使用认证机构的公开密钥认证服务器的证书,如果认证通过,也就能说明:1、该认证机构确实是可信任的那家(不然用公开密钥也解不开呀) 2、该服务器确实是可信任的那家(还涉及到服务器发来的消息,后面还会讲到)。
客户端又是怎么拿到认证机构的公开密钥的?看有些地方说是通常浏览器、操作系统都会内置一些可信任的机构的公开密钥的。反正嘛,一旦有一家可信任了并且打通了,那就可以连锁反应互相担保了,就这样认为吧:在互联网混沌初开时期,靠着走路去开天辟地以来的第一家认证机构拿到了公开密钥,后来该机构又说某某也是可信任的,然后……这样所有可信任的机构就都互相担保串联起来了。
https的通信
TCP连接:由于TLS是在TCP之上的,所以每次连接都会先发起TCP连接,完成三次握手之后才进入到TLS的环节。以下是TLS 1.3之前的流程。1.3对流程做了简化,但原理大致相同。
1、客户端通过发送Client Hello报文(含客户端随机数)开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件(Cipher Suite)列表。服务器端收到后会以一个ACK回复。
2、服务器可进行SSL通信时,会以Server Hello报文(含服务端的随机数)作为应答。和客户端一样,在报文中包含SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。客户端同样以一个ACK回复。
3、之后服务器发送Certificate报文。报文中包含公开密钥证书。这一步也就是前文提到的,客户端拿到该证书后先用认证机构的公开密钥解密,认证通过后也就能确认该服务器可信任了,也就拿到了服务器的公钥。
4、最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。
5、SSL第一次握手结束之后,客户端以Client Key Exchange报文作为回应。报文中包含通信加密中使用的一种被称之为Pre-master secret(预主密钥)的随机密码串。该报文已经用步骤3中的公开密钥进行加密。服务端收到后会用私钥解密得到该预主密钥。
双方会使用预主密钥、双方的随机数及协商好的算法计算出一个相同的主密钥。无论加密、解密,都是用这个主密钥,所以这个主密钥属于对称加密。
6、接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会采用master secret即主密钥加密。
7、客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
8、服务器同样发送Change Cipher Spec报文。
9、服务器同样发送Finished报文。
10、服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到SSL的保护。从此处开始进行应用层协议的通信,即发送HTTP请求。
11、应用层协议通信,即发送HTTP响应。之后的数据发送就都是用主密钥加密了。
至此,做个总结:TCP连接 -> 客户端发起TLS连接 -> 服务端用证书(含公钥)及其他协商信息回复 -> 客户端验证 -> 客户端和服务端用双方的随机数和预主密钥协商出主密钥-> 使用主密钥加密并传输数据。
再简化:使用非对称密钥的方案把对称密钥协商出来,再用对称密钥加密、传输、解密。
其实主密钥的生成很复杂,这里不再详解,因为……我要紧着时间去研究面试用得着的东西。
下面是一个TLS 1.3的报文展示 注意这是1.3版本的,1.3版本的流程更简化
下图是第 26041 帧,即客户端发出的client hello的报文
下图是第 26062 帧,即服务器的报文
下面是一个TLS 1.2版本的 server hello done报文。由于TLS 1.3版本简化了流程,包括server hello done在内的一些步骤或报文就没有了。