简介
本篇博客主要是针对https
进行了一个剖析,我会从以下三个方面进行讲解:
- 为什么要有
https
?他用来解决什么呢? https
的通信过程https
和http
的区别
下面首先说下为什么要存在https
.
为什么要有https
大家应该都知道http
是明文传输,那么明文传输就会造成以下风险
- 窃听风险,第三方可以获知通信内容
- 篡改风险,第三方可以修改通信内容
- 冒充风险,第三方可以冒充他人身份参与通信
那么https
就出现了,它主要的目的就是
- 所有信息都是加密传播,第三方无法窃听
- 具有校验机制,一旦被篡改,通信双方会立刻发现
- 配备身份证书,防止身份被冒充
那么它是怎么实现的呢?他利用的是SSL/TLS协议
,这个协议位于会话层,也就是传输层tcp
之上,那么SSL/TLS
协议主要干了什么呢,也就是https
的通信过程。
https的通信过程
首先,我花了一个简易的图,大家可以先看下:
可以看出,上图有4次传递,这个过程就称为SSL/TLS
的四次握手,下面咱们就具体讲下:
- 首先客户端向服务端的443端口发送请求,告诉服务端自己支持的
加密方法
、TLS的版本号
,一个随机数A
- 服务端收到后,利用
RSA
算法生成非对称秘钥(公钥和私钥)
,然后服务端会利用哈希算法(sha256)对网站内容进行hash,生城一个数字签名(指纹)
,防止篡改,CA
机构会利用自己的私钥
对证书的内容和证书签名进行加密,内容包括网站的网址、网站的公钥、证书的有效期等,最后把选择的加密方法
、TLS的版本号
,数字证书
和一个随机数B
告诉客户端 - 当客户端收到后,首先是要验证证书的身份
- 首先浏览器会从内置的证书列表中索引,找到服务器下发证书对应的机构,如果没有找到,此时就会提示用户该证书是不是由权威机构颁发,是不可信任的。如果查到了对应的机构,则取出该机构颁发的公钥
- 接下来就验证网站内容是否被篡改,原理就是浏览器根据签名的哈希算法针对
证书的内容
进行hash,然后把此次hash结果和解密出来的数字签名(指纹)进行比较,如果相同,则说明没有被篡改,就可以正常使用解密出来的网站公钥了。 - 最后浏览器会再次生成一个随机数C,利用网站的公钥加密,发送给服务端
- 服务端拿到后,利用私钥进行解密,得到随机数C,这时候客户端和服务端就都拥于三个随机数了,接着就按照之前约定好的加密方式,利用这三个随机数计算生成
对称秘钥
,然后利用这个对称秘钥
加密网页内容并传输给客户端 - 客户端收到后,同样按照之前约定好的加密方式,利用这三个随机数计算生成
对称秘钥
进行解密。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP
协议,只不过用对称秘钥
加密内容。
需要特别注意的是,客户端和服务端是利用非对称秘钥
进行加密,而通信则使用对称秘钥
,为什么这么做呢?这是因为非对称加密
计算量比较大,运算速度慢,但是安全,而对称加密
不安全,但是运算速度非常快~
https和http的区别
- http端口是80,而https端口是443
- http是超文本传输协议,信息是明文传输,https是SSL/TLS协议加密传输
- https协议需要到CA申请证书
- http是无状态的,https具有身份认证,校验机制,比http安全