起初设计HTTP协议的目的就是为了传输超文本文件,所以HTTP一直保持着明文传输的性质。但这个容易被中间部分给窃取、篡改。
HTTP数据交给TCP后,会经过WIFI路由器、目标服务器等环节,存在被窃取、篡改的风险。
在HTTP协议栈中引入安全层
鉴于HTTP的明⽂传输使得传输过程毫⽆安全性可⾔,且制约了⽹上购物、在线转账等⼀系列场景应⽤,于 是倒逼着我们要引⼊加密⽅案。
从HTTP协议栈层⾯来看,我们可以在TCP和HTTP之间插⼊⼀个安全层,所有经过安全层的数据都会被加密或者解密。
所谓HTTPS,就是在HTTP和TCP直接通信的过程中加一个安全层,让HTTP先和安全层通信,安全层再和TCP通信。
所以HTTPS的重点就在于安全层
总的来说,安全层有两个主要的职责:对发起HTTP请求的数据进⾏加密操作和对接收到HTTP的内容进⾏解密操作。
第⼀版:使⽤对称加密
所谓对称加密是指加密和解密都使⽤的是相同的密钥。

为了让加密的密钥更加难以破解,我们让服务器和客⼾端同时决定密钥
- 浏览器发送它所⽀持的加密套件列表和⼀个随机数client-random,这⾥的加密套件是指加密的⽅法,加 密套件列表就是指浏览器能⽀持多少种加密⽅法列表。
- 服务器会从加密套件列表中选取⼀个加密套件,然后还会⽣成⼀个随机数service-random,并将servicerandom和加密套件列表返回给浏览器。
- 最后浏览器和服务器分别返回确认消息。
双方产生的随机数混合起来生成一个密钥master secret。有了密钥master secret和加密套 件之后,双⽅就可以进⾏数据的加密传输了。
虽然功能实现了,但其中传输client-random和service-random的过程却是明⽂的,这意味着⿊客也可以拿到协商的加密套件和 双⽅的随机数,由于利⽤随机数合成密钥的算法是公开的,所以⿊客拿到随机数之后,也可以合成密钥,这 样数据依然可以被破解,那么⿊客也就可以使⽤密钥来伪造或篡改数据了。
第⼆版:使⽤⾮对称加密
⾮对称加密算法有A、B两把密钥,如果你⽤A密钥来加密,那么只能使⽤B 密钥来解密;反过来,如果你要B密钥来加密,那么只能⽤A密钥来解密
在HTTPS中,服务器会将其中的⼀个密钥通过明⽂的形式发送给浏览器,我们把这个密钥称为公钥,服务器⾃⼰留下的那个密钥称为私钥。
公钥是每个⼈都能获取到的,⽽私钥只有服务器才能知道,不 对任何⼈公开。

- 浏览器发送加密套件给服务器
- 服务器选择一个加密套件和公钥返回给服务器
- 然后是双方确认消息
浏览器发送数据时用公钥进行加密发送,虽然黑客可以截下来,但唯一能解读加密信息的只有服务器的私钥,这样就保证了数据的安全性。
这看上去似乎很完美,不过这种⽅ 式依然存在两个严重的问题。
- 第⼀个是⾮对称加密的效率太低,第⼀个是⾮对称加密的效率太低
- **第⼆个是⽆法保证服务器发送给浏览器的数据安全。**虽然浏览器端可以使⽤公钥来加密,但是服务器端只 能采⽤私钥来加密,私钥加密只有公钥能解密,但⿊客也是可以获取得到公钥的,这样就不能保证服务器 端数据的安全了。
第三版:对称加密和⾮对称加密搭配使⽤
在传输数据阶段依然使⽤对称加密,但是对称加密的密钥我们采⽤⾮对称加密来传输。

- ⾸先浏览器向服务器发送对称加密套件列表、⾮对称加密套件列表和随机数client-random;
- 服务器保存随机数client-random,选择对称加密和⾮对称加密的套件,然后⽣成随机数servicerandom,向浏览器发送选择的加密套件、service-random和公钥;
- 浏览器保存公钥,并利⽤client-random和service-random计算出来pre-master,然后利⽤公钥对premaster加密,并向服务器发送加密后的数据;
- 最后服务器拿出⾃⼰的私钥,解密出pre-master数据,并返回确认消息。
pre-master是经过公钥加密之后传输的,所以⿊客⽆法获取到pre-master,这样⿊ 客就⽆法⽣成密钥,也就保证了⿊客⽆法破解传输过程中的数据了。
第四版:添加数字证书
这个权威机构称为 CA(Certificate Authority),颁发的证书就称为数字证书(Digital Certificate)。
对于浏览器来说,数字证书有两个作⽤:⼀个是通过数字证书向浏览器证明服务器的⾝份,另⼀个是数字证书⾥⾯包含了服务器公钥。