为什么要使用 HTTPS 协议
在将 HTTP 数据提交给 TCP 层之后,数据会经过用户电脑、WiFi 路由器、运营商和目标服务器,在这中间的每个环节中,数据都有可能被窃取或篡改。比如用户电脑被黑客安装了恶意软件,那么恶意软件就能抓取和篡改所发出的 HTTP 请求的内容。或者用户一不小心连接上了 WiFi 钓鱼路由器,那么数据也都能被黑客抓取或篡改。
什么是 HTTPS 协议
实际上就是在 HTTP 协议栈中引入安全层,所有经过安全层的数据都会被加密或者解密
安全层有两个主要的职责:
- 对发起 HTTP 请求的数据进行加密操作。
- 对接收到 HTTP 的内容进行解密操作。
下面一步步实现一个从简单到复杂的 HTTPS 协议
第一版:使用对称加密
对称加密是指加密和解密都使用的是相同的密钥。
- 浏览器端弄个随机数(
client-random
),并发送它所支持的加密套件列表(指浏览器能支持多少种加密方法列表)。 - 服务器从发过来的加密套件列表里选择一个,并也整个随机数(
service_random
),并返回给浏览器 - 浏览器跟服务器分别返回确认信息。
按加密套件算法,将client-random
和service-random
混合起来生成一个密钥master secret
,然后基于这个密钥进行数据的加密传输。
缺点:
由于 client-random
与 service-random
都是明文传输,所以会被截获。
黑客拿到协商的加密套件和双方的随机数,生成密钥。
第二版:使用非对称加密
非对称加密算法有 A、B 两把密钥,如果你用 A 密钥来加密,那么只能使用 B 密钥来解密;反过来,如果你要 B 密钥来加密,那么只能用 A 密钥来解密。
- 浏览器发送它所支持的加密套件列表。
- 服务器会生成个公钥跟私钥,公钥是给浏览器加密使用的,所以将公钥跟选择的加密套件返回
- 浏览器跟服务器分别返回确认信息。
这样浏览器向服务端发送数据时,就可以采用公钥来加密数据,由于公钥的数据只有对应的私钥才能解密,即便黑客截取了数据和公钥,也是无法解密的。
缺点:
- 非对称加密的效率太低
- 无法保证服务器发送给浏览器的数据安全,因为服务端是采用私钥加密的,而黑客是可以拦截到公钥,这样服务端返回的数据就得不到保障。
第三版:对称加密和非对称加密搭配使用
在传输数据阶段依然使用对称加密,但是对称加密的密钥我们采用非对称加密来传输。
- 浏览器端弄个随机数(
client-random
),并发送它所支持的加密套件列表和非对称加密套件列表。 - 服务器会生成个公钥和私钥,并弄个随机数(
service-random
),返回该随机数、公钥、选择的加密套件、非对称加密套件 - 浏览器再生成个随机数
pre-master
,并采用公钥加密,进行浏览器确认 - 最后服务器拿出自己的私钥,解密出
pre-master
数据,并返回确认消息。
这样浏览器跟服务器就有了一致 client-random
, service-random
,pre-master
,根据这些生成对称密钥,由于两端采用的是一套对称加密套件,所以生成的密钥是一致的。
pre-master
是经过公钥加密之后传输的,所以黑客无法获取到 pre-master
,这样黑客就无法生成密钥,也就保证了黑客无法破解传输过程中的数据了。
缺点:
黑客通过 DNS
劫持将你所在官网的 IP 地址替换成了黑客的 IP 地址。
即无法证明服务器是可靠的。
第四版:添加数字证书
需要服务器向浏览器提供证明“我就是我”:
使用权威机构颁发的证书,这个权威机构称为 CA(Certificate Authority),颁发的证书就称为数字证书(Digital Certificate)。
对于浏览器来说,数字证书作用:
- 一个是通过数字证书向浏览器证明服务器的身份
- 另一个是数字证书里面包含了服务器公钥。
两点改造: - 服务器没有直接返回公钥给浏览器,而是返回了数字证书,而公钥包含在数字证书中;
- 在浏览器端多了一个证书验证的操作,验证了证书之后,才继续后续流程。
HTTPS 的握手过程
- 首先是
tcp
的三次握手建立连接 client
发送random1
+支持的加密算法集合(clientHello
)server
收到信息,返回选择一个加密算法 +random2
(serverHello
)+ 证书+ 确认clent
验证证书有效性,并生成随机数pre-master
,并通过服务器公钥加密 发送给server
server
收到premaster
,根据约定的加密算法对random1
+random2
+premaster
(解密)生成master-secret
,然后发送预定成功client
收到生成同样的master-secert
,对称加密秘钥传输完毕