前言:
HTTPS无时无刻在网络冲浪中发挥着作用来为网络通讯的安全性提供保护,对于研发来说HTTPS更是随处可见,无论是日常开发还是面试。了解并熟悉HTTPS的工作流程与背后原理都是比较重要的。
为什么需要HTTPS
HTTPS的出现主要为了解决HTTP的明文特性,由于TCP/IP的机制,通信内容在所有线路上都是有可能被窥探的,明文特性也就给了恶意的人一些可乘之机,例如:
- 通过中间人攻击,窃取账户登陆信息或者银行卡信息
- 内容被恶意篡改,HTML被恶意注入广告
- 访问恶意服务器被窃取信息 当然了,HTTPS并不能解决所有安全问题,并且HTTPS也有自己的缺点,例如占用服务器更多的CPU与内存资源,CA认证出错,在一定程度上也会被利用造成安全问题。
什么算是安全的通讯协议
在开始介绍HTTPS前,可以先确定什么是一个安全的通信过程,基本上需要满足四个特性:
- 机密性:让通讯以外的人无法看到或看不懂通讯内容。
- 完整性:传输过程中信息不会被篡改
- 身份认证:通讯双方身份可以被验证
- 不可否认:不能否认已经发生过消息,如果缺了这一特性,通信的真实性得不到保证
一些前置概念:
在深入了解HTTPS通讯过程之前,有一些概念与名词更有助于我们理解整个过程:
- 加密:是可读的明文转换为可读性差的文本的过程,加密通常需要密钥。
- 对称加密: 只有一个密钥🔑,所有通信方都使用相同的密钥进行加密和解密。
- 加密分组模式:让算法用固定长度的密钥加密任何长度的明文
- 非对称加密:有两个密钥,公钥🔑(public key)用来加密,私钥🔑(private key)用来解密,两者具有单向性,由公钥加密后只能用私钥来解密,反过来,私钥加密也只能用公钥解密。
- 公钥是公开的,供任何人使用。(非对称加密是TLS的基础技术)
- 私钥是保密的
- 对称加密: 只有一个密钥🔑,所有通信方都使用相同的密钥进行加密和解密。
- 会话密钥:加密收件人与发件人约定的一组数学值,仅对单次通信会话进行加密的任何对称加密密钥
- 加密算法:用来将数据转换为密文的数学公式,将使用密钥可以双向更改数据。
- 对称加密算法:AES,SNOW
- 非对称加密算法:RSA,椭圆曲线加密
- 密码套件(cipher suite):一组用来建立安全通信连接的算法。在SSL/TLS握手过程中一个重要组成部分,通信双方会对使用哪个密码套件达成一致意见。密码套件的命名格式相对固定(以TLS1.2举例,1.3会有所不同),组成部分由:"密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法"
- SSL/TLS:SSL是安全套接层,处于OSI中的第五层(会话层),是TLS的前身,目前已经弃用,在1999年时将SSL的名字更改为TLS。TLS的作用则是保证在网络传说中的加密,身份验证,完整性
- SSL/TLS握手:HTTPS中的核心部分,也是启动TLS通信会话的过程。在握手过程中,通信双方交换消息以相互确认,验证,确定使用的加密算法,生成一致的会话密钥。
- SSL证书 & CA证书:SSL证书使网站能够从HTTP转到HTTPS,一般托管在网站源服务器中的数据文件,包含了网站的公钥,网站标识,相关信息。如果需要与源服务器进行通信都需要引用该证书,证书的类型还有很多种,例如,单域,通配符,多域(不深入介绍了)。SSL证书是CA证书中的一种,任何由CA认证机构颁发的证书都可以称为CA证书。由认可的CA机构发布的SSL证书则解决了"公钥信任"的问题,
- 数字签名:确保数据发送者的合法身份,主要用来保证数据的完整性。数字签名会随着文本的变化而不同。
HTTPS与TLS握手
HTTPS也称为HTTP over TLS,继承了所有HTTP的特性,例如缓存,Cookie,重定向,传输大文件等等。默认的端口号是443(HTTP是80)。HTTPS的核心就在TLS,在TCP/IP之上加了一层 SSL/TLS 协议。
TLS如何做到安全通讯:
- TLS实现机密性的方式就是通过信息加密,使用某种加密算法把网络中的消息转换成不可读。
- 过程中就是使用了非对称加密,由服务器保管私钥,在网上任意发布公钥,当用户登录网站时,使用公钥加密,密文只能由拥有私钥的服务器解密。在通讯刚开始时,客户端先产生会话密钥,再用服务器发布的公钥进行加密后发送回服务器,服务器收到后用私钥解密,取出会话密钥,之后就可以直接进行对称加密了。
- 通过摘要算法,保证数据的完整性:
- 摘要算法具有"单向性"和"雪崩效应",输入不同会导致输出的变化,所以TLS则使用摘要算法来生成伪随机数,服务器收到后会计算一下消息的摘要,把随机数与自己的摘要进行对比如果一致,则说明消息是比较完整可信的。
- 身份认证/公钥信任: 由CA认证机构颁发的数字证书解决,例如浏览器会验证证书的可信程度来判断用户访问的网站是否是信任的。(如果CA证书机构出错,可能导致用户访问的网站是钓鱼网站)
- 不可否认:靠数字签名解决,内容摘要算法得到摘要,私钥加密摘要,对方使用对应公钥解密,得到摘要,再和自己得到的服务器提供的原文摘要对比,一致说明这个内容就是原服务器提供的,由证书说明了服务器的身份。
何时进行TLS握手
- 导航到一个HTTPS的网站时,在任何其他使用HTTPS时(API调用,DNS over HTTPS)也会发生TLS握手
- 在HTTPS中,通过TCP握手打开TCP连接后,将发生TLS握手
TLS握手过程
- 客户端问候(client hello)消息:客户端通过向服务器发送"问候"消息开始握手,其中包括客户端支持的TLS版本,支持的密码套件,客户端随机数
- 服务端问候(server hello)消息:对client hello消息的回复,包含了服务器的CA证书,服务器选择的密码套件,以及服务器随机数
- 身份验证:客户端使用颁发该证书的证书颁发机构验证服务器的 SSL 证书,在这一步会进行数字签名验证保证数据的完整性。
- 预主密钥: 客户端再发送一串"预主密钥(premaster secret)"。预主密钥是使用服务器中的公钥加密,只能使用服务器的私钥解密。
- 私钥被使用:服务器对客户端的预主密钥进行解密。
- 生成会话密钥(session key):客户端和服务器均使用客户端随机数、服务器随机数和预主密钥生成会话密钥。双方应得到相同的结果。
- 客户端就绪:客户端发送一条"已完成"消息,该消息用会话密钥加密。
- 服务器就绪:服务器发送一条"已完成"消息,该消息用会话密钥加密。
- 实现安全对称加密:已完成握手,并使用会话密钥继续进行通信。
在TLS1.3中,TLS握手只需要一次往返 ,并且放弃了RSA和其他容易攻击的加密算法。使 TLS 1.3 握手更快更安全。有兴趣的同学可以自行查看网络上的资料。
以上就是HTTPS简介,希望大家能够了解HTTPS在网路通讯中的作用与如何实现安全可靠的传输。也希望大家能够积极留言沟通~
References:
- www.cloudflare.com/zh-cn/learn...
- 《极客时间》--- 透视HTTP协议,非常感谢Chrono老师,让理解更上了一层