HTTPS实战全记录之原理篇

2019/8/6 9:44:00

 
关于HTTPS,基本上你想知道的都在这里了。本文原标题《HTTPS原理与实践》,下图是本文配套PPT的目录截图:

 
原理篇
2.1. 认识HTTPS
先说一下,本文可能有些地方由于描述不到位或者我本人理解错误而出现不准确内容,有错误欢迎指正!
 
2.1.1. 什么是HTTPS
HTTPS全称Hyper Text Transfer Protocol over Secure Socket Layer,直译过来就是通过SSL实现的超文本传输协议,简单来讲就是加密版的HTTP协议,也就是HTTP+SSL/TLS

 
 
为什么需要加密版的HTTP呢,因为我们都知道,HTTP是明文传输的,因此使用HTTP协议传输隐私信息非常不安全,很容易在传输过程中被窃取,或者通信内容被人篡改冒充,使用HTTPS可以避免这些问题。
 
2.1.2. SSL/TLS
为了解决HTTP明文传输的风险性,网景公司设计了SSLSecure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPSSSL目前的版本是3.0,被IETFInternet Engineering Task Force)定义在RFC 6101中,之后IETFSSL 3.0进行了升级,于是出现了TLSTransport Layer Security1.0,定义在RFC 2246。实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词。
 
上面一大段话是转载的,简单而言就是TLSSSL的升级版,现在浏览器一般用的都是TLS
 
2.1.3. HTTPS的优点
从底层分析HTTPS有以下3大优点:
 
防窃听:信息被加密了,第三方拿不到密码,所以可以防窃听;
防篡改:还是因为信息被加密了,如果执意篡改的话,客户端无法解密不说,而且数据完整性校验这一关也过不了;
防冒充:防止攻击者冒充他人身份参与通信,比如HTTPS的双向认证;
从实际出发来看,HTTPS主要有以下优点:
 
防止私密信息泄露,防止信息被篡改;
有助于SEO,百度、谷歌均明确表示会优先收录、展示HTTPS站点的内容;
完全杜绝运营商HTTP劫持问题;
有效解决运营商DNS劫持问题,降低网站被劫持的风险;
HTTPS的小绿锁表示可以提升用户对网站信任程度(当然不是说有小绿锁的都是安全的);
可以有效防止山寨、镜像网站等;
为未来升级HTTP/2做准备,HTTP/2必须基于HTTPS部署;
下面单独对34说一下。
 
运营商HTTP劫持我们都知道,经常莫名奇妙的在自己网站上看到各种恶意的恶心广告,查看代码发现被注入了一些奇奇怪怪的js,这其实就是HTTP劫持,启用了HTTPS之后,我们传输的内容都是加密的,运营商想篡改内容都没辙。
 
为什么HTTPS能够有效的解决DNS劫持呢?在域名被劫持的情况下,客户端访问的实际上是攻击者的IP,客户端通过这个IP找到攻击者的服务器,要求建立HTTPS通信,因为攻击者没有真实服务器的证书和私钥(想要申请这个域名的证书必须验证自己是这个域名的所有者,攻击者做不到这一点),把伪造或自签名的证书提供给客户端,是得不到浏览器的认可的,浏览器会弹出不安全的警告。但是用户执意要访问我们也没办法,所以才用了有效解决而不是彻底解决这一词。
 
另外,就近看的话,越来越多的场合强制要求https(比如ios、微信小程序等等都要求https),从长远看,升级HTTPS是大势所趋,一次升级,永久受益。
 
2.1.4. HTTPS的缺点
服务器性能下降,开启HTTPS会增加内存、CPU、网络带宽的开销,特别是非对称加密这一块;
访问速度下降,HTTP连接的建立需要3次握手,HTTPS还需要加上ssl的几次握手(具体是几次没去考究,有说是9次),当然下降主要是在第一次建立连接的时候,后面正常通信速度一般没啥变化;
除了握手部分外,所有信息传输之后浏览器和服务器都要进行加密解密,又是一笔额外的开销;
申请证书需要一笔花费,当然现在免费证书也很容易申请到,这个不算明显缺点;
一句话概括就是:性能和速度下降,但是具体下降多少呢,这个不太好讲,可以延伸阅读:HTTPS 要比 HTTP 多用多少服务器资源?
 
2.1.5. HTTPS原理
HTTPS主要分为单向认证和双向认证,99%的场景都只需要单向认证,双向认证我们后面再来讲。
 
2.1.5.1. 小明和小红的故事
在介绍HTTPS原理之前,我们先来假设,假如让我们自己设计一套加密方案该如何实现呢?为了更好理解,我们用人来举个栗子:

 
 
小明(客户端)暗恋小红(服务端),想给小红写信,但是又怕信在邮递的过程中被人偷看,所以他把信装在一个盒子里锁起来,信虽然是安全了,但是小红就算收到了打不开啊,把钥匙给小红寄过去?万一钥匙也被人偷去了怎么办?
 

 
就在这时,小红想到了一个办法:小红把一个没有上锁的盒子寄给小明(钥匙在小红这),小明把钥匙放进去再锁上(小明可以锁盒子,但是一旦锁上了就连自己都打不开了),然后把这个装有钥匙的盒子寄回给小红,因为小红有钥匙,所以能打开盒子拿到里面的锁信件盒子的钥匙,再然后就能看到小明给她写的信了。同时,小红想回信的话,也可以把信装在这个盒子里寄回去,因为这是小明的盒子,他自己肯定还有一把锁,所以他也能打开,从此,小明和小红就可以任意的写信私通而不用担心其他人能看到了!
 
但是,如何保证小红寄送过来的未上锁盒子不被别人调包呢?这个等到我们介绍完HTTPS原理之后我们再回过头来看这个问题。