提
前言
我们了解 HTTP 后,那么必然就离不开对 HTTPS 的认识,他们可以说是我们必须认识的两兄弟了~~一、为什么需要HTTPS?
我们在上一篇中介绍到了 HTTP 简介,了解什么是HTTP,他为了解决什么问题,那么这里的 HTTPS 是什么呢?是为了解决什么问题呢?
那么我们就要了解 HTTP 有什么缺点,因为 HTTPS 的出现就是为了解决这些缺点的。
那么 HTTP 有什么缺点呢?
- 首先是不加密,内容可能会被窃取
我们的网络就像以往的电报一样,是很容易被截取到的,只需要收集网络上的数据包就可以了(抓包工具 wireshark )。因此可以对数据加密,一般有两种方式,一种是对通信线路加密(SSL / TLS) 或者 是对内容加密 (加密 HTTP报文) - 不验证身份,因此可能会被伪装
HTTP协议是没有办法确认请求和响应的,所以你不知道发给你响应的是否是真的服务器,同时服务器也没办法确认接收的请求是否是真的客户端。所以对于任何一方都存在伪装的可能性。因此对于这个问题,一般会使用 SSL 加密处理,同时还有证书来证明身份。 - 无法确认信息的完整性,所以可能会被篡改
HTTP协议没有办法证明通信过程的报文完整性,这个报文可能中间被修改,缺少,添加都有可能。常用的是使用MD5 和 SHA-1等方法来验证
哈哈哈,发现有点像 TCP 和 UDP 之间。
二、HTTPS
HTTPS
其实HTTPS 也不是啥新鲜玩意,他不过是身披SSL外壳的HTTP,之前 HTTP 是直接和 TCL 通信, 而如今是先和 SSL 通信,再由 SSL 和 TCP 通信。
很自然又有了两个问题?
- 为什么 HTTPS 是安全的呢?
- HTTPS 如何保证安全?
为什么 HTTPS 是安全的?
那么为什么是安全的呢?首先我们说HTTP不安全主要是因为上面的三个问题。下面我们看个故事:
小文在河的一边,小默在河的另一边,他们每天都要传递互相写信,那么他们之间有同号通过一只信鸽来互相发送信息。理想的情况下是没有任何问题,小文把信息绑到信鸽上,信鸽送给小莫默,小默收到后以同样的方式会信给小文。
但是
突然小虎是黑帮的人,他知道小文和小默的通信,但是不确定具体是谁,他要挖出这两个人,原来小文和小默是间谍,他们小杰潜入了黑帮要打听里面的信息,小虎想抓住小默,没有打草惊蛇,想获取他们的通信的信息。这时候,小文和小默之前的通信方式可以说就是没有安全措施的 HTTP 通信。小虎一直通过截取信鸽来获取他们的通信内容。
后面
小文和小默发现他们的通信方式不安全,要是被别人截取了,就被人知道了。所以他们约定通信信息要以某种方式才能解读(就像小说中,需要火烤或者蘸水显示之类的)。好了,这时候信息就有了加密,小虎就算截取到,也解密不出来。这里就解决了我们是哪三个问题中的第一个和第三个!内容不加密,内容可能会被窃取和无法确认信息的完整性,所以可能会被篡改。而这种就叫做 对称秘钥加密。这时候小虎就获取不到了,因为他不知道如何解密。
但是
这里面又有一个问题了。小杰和小默是第一次通信,他们如何告知对方解密的方法呢?
所以又有了另外一种加密的方式!
- 小问发送了没有带有任何信息的鸽子给小默。
- 小默返回一个鸽子,携带有打开锁的盒子,但是保留密钥。
- 小文将信息放到盒子里,把锁关上,并且把盒子发送给小默。
- 小默接收到盒子,用密钥打开,然后阅读。
这样就解决了双方没有碰面无法确定秘钥的问题。也就做非对称秘钥加密。可以说盒子是公钥,而锁匙是私钥。
但是,小虎贼心不改,他截取了盒子,并且把这个盒子换为他的盒子。这时候小文如何确认盒子就是来自小默的呢?所以这时候他们对盒子签名,他们通过对盒子签名来辨识是否来自对方,但是这里又有了如果他们是第一次见面的如何确认这个其签名是对方的呢?所以他们请了一个很出名,方圆最出名最正直的人小法来签名,所有人都相信小法只为合法的人签名。在这里就解决了第二个问题:不验证身份,因此可能会被伪装,而小法也就是我们的认证机构,颁发证书的。
倒这里可以说小文和小默的通信是比较安全的了。
流程的过程可以看下图:
基本流程就是:
- 客户端发起请求,请求报文会携带客户端支持的SSL版本和加密组件列表,请求会连接诶到服务端的443端口。
- 服务端收到后,会从中选择双方都支持加密方式,同时返回证书。服务端保留私钥。
- 客户端收到后会验证证书的有效性,验证通过会进行下一步,反之断开。同时取出公开密钥。
- 接着客户端湖生成一个随机数(pre-master secret)。同时用服务端的 Hash算法计算握手信息。接着会用随机数加密握手信息和hash值。同时用公开密钥加密随机数和握手信息以及 hash值进行发送。
- 服务端收到用私钥解密出随机值,用随机值解密hash值,并且计算与自己发送的 握手信息的hash进行对比,确保握手信息没有被篡改。
- 同时服务端也会使用随机值加密发送握手信息以及 hash值到客户端进行验证。
- 双方都没有问题之后,就会使用随机值作为双方的秘钥,进行对称加密传输。
里面hash值的验证是为了保证报文信息没有被篡改,保护报文的完整性。因为这个握手过程是明文的,有被窃取修改的风险。也可以使用别的方法,比如MAC算法等里,了解更多看这篇有介绍到。hash算法的验证如下:
三、HTTP 和HTTPS又什么区别
- HTTP的端口是 80, HTTPS 的是443
- HTTP直接和TCP连接, HTTPS 会先进行SSL/TLS,然后SSL/TLS和TCP连接
- HTTP 是明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好
- HTTP不需要证书,而HTTPS 需要用到 CA (数字证书)要钱~
- HTTP 比 HTTPS 响应更加的快,因为不需要要验证的,没那么耗费资源
常见问题
- HTTPS 一定安全么?
不一定的,首先基于对CA的信任如果这里有问题就不安全了,之前发生过某个证书机构被黑客入侵导致很多网站安全受到威胁。
同时数字证书不一定是CA机构的,是自签名证书~~无法确保的。
- 为什么数据的传输是使用对称加密?
我们可以知道,非对称加密是很麻烦的,要先发送空的请求。然后传回盒子,盒子锁上信息。在实际中,这样是很低效率的!而使用非对称加密是为了解决首次的通信,大家不知道秘钥的情况下,确保秘钥的安全。所以我们在首次通过非对称获取到秘钥后,后面是可以通过对称加密,来提高通信的效率的。所以在HTTPS 中是使用混合加密的机制的。
- 为什么需要认证机构?
我们看上面的故事可以知道。通过双方的签名是可以确保盒子的来源的,但是同样的,会类似问题二一样,当第一次通信的时候,你如何确保,你收到的签名就是真实的签名而不是伪造过后的呢?而认证机构就是大家都认可的,可信的。通过他颁发的签名,可以确保就是真实的。
- HTTPS 这么好,为什么不是所有网站都使用呢?
加密通信会消耗更多的CPU 和资源,导致服务器平摊到每一台客户端的请求变少。所以一般对非敏感的信息使用 HTTP,只是对必要的才进行加密。同时节约购买证书的开销~~证书的授权费用还是不便宜的。
同时 HTTPS中使用SSL 会导致请求的处理变慢(HTTPS大约比HTTP慢2-100倍)。因为多了SSL通信,同时还得进行加密和解密的运算处理。
- SSL 和 TLS 有什么区别?
SSL 也叫安全套接字层,位于 HTTP之下,TCP之上的一个协议成,为了保障数据的安全加密。所以 HTTPS 也可以说是HTTPS + SSL/TLS。
它的功能也就是我们HTTPS和HTTP的差异:
1.认证用户和服务器,确保数据发送到正确的客户机和服务器,互联网连接安全;
2.加密数据以防止数据中途被窃取;
3.维护数据的完整性,确保数据在传输过程中不被改变
而TLS可以说也就是SSL的加强版,他在SSl的基础上加强了,比如支持的加密算法,报警代码等等。
具体可以看中这篇文章:SSL与TLS的区别以及介绍