最近在看一些关于https的东西,其他人写的博文啊什么,有写的比较通俗的,有写的比较晦涩的,我就在思考:其实任何一种技术的产生都是服务于现实需求的,也就是为解决实际问题或者对已有版本的存在的问题进行改进。https也不列外,那如果以解决已有问题的思路去理解它,那我想是相对比看一堆名词和理论要容易理解的多。另外我在想其实很多事务都有共通性,即虽然看似不是一个领域的事,但是解决问题的思路和方法,细细想来,其实很相似,所以我们在理解一种技术的时候,如果能以现实生活的例子做类比,那对我们的理解又会更上一层楼。废话不多说(其实已经说了很多),下面来验证我的思考,就以我https为例吧:

        按照我思考的第一点,说到https,他首先就是千万种技术中的一种,那我们首先就要思考这种技术为什么会产生。我们都知道当今互联网使用最广泛的服务应当就是web服务,就是日常我们用浏览器打开各种网页这种,普通用户其实只是做了一个简单的打开操作,那实际上这个操作背后有许多技术在支撑,http就是其中一个。

        首先http就是一种协议,协议是什么呢,就是一种流程,一种规范,比如我们实际生活中买东西也罢,吃东西也罢,都是在按着一定的流程和规矩在办事的,那放到网络上也一样,我们在浏览器中打开一个网页,实际上就是想看到我们想看的东西,那这个东西是放在你打开的这个网页背后对应的公司的服务器上的,由于不是面对面的交流,这种交流的方式是通过网络来实现的,就像我们跟远方的朋友交流用电话实现一样,那么问题来了,这么多用户和服务器交互,如果没有一个规矩,那根本不能实现有序良好的交流,想想如果没有交通规则,马路上的车该如何通行吧。所以http这种协议产生的目的就是为规范浏览服务。比如如果跟网站(服务器)请求数据,如果返回数据,如果控制交互过程中的一些细节等。

         我们知道了http为什么会出现,那其实任何一种技术刚产生都只会考虑当前环境的因素,即使能做长远考虑,也未必能完全适应未来的发展,毕竟生活环境的变迁及技术的演进有时的确难以预料。http跟其他任何技术一样,刚出现时可能只考虑解决了需求,却对安全性没有过多考虑。http协议下的数据传输都是明文方式进行的,就像现实生活中如果正常用白话交流,别人如果原因听,其实是很容易听到的,网络世界里的交流也是一样,所以可以说http解决了web浏览服务这种需求,但是却很不安全。这就是https产生的原因。

         https比http多了一个S,这个多出的S代表什么呢?其实就是指SSL/TLS,说的直白点就是在http这种协议上又套了一个壳子,为什么要套这个壳子呢,前面说过,为的就是解决上一代http协议的安全问题。那为什么又是SSL,又是TSL呢。他们有什么区别呢。其实就是一套东西。刚开始诞生的时候就叫SSL(安全套接字层),一开始是由已给叫网景公司开发出来的,后来这个公司倒闭,IETF(一个管理互联网技术规范的组织)接手了这个协议,重新起了个名字叫TLS(传输层安全),就是这么回事,哈哈。明白了https为什么产生,以及多出那个S是个啥玩意,下面开始正经说下这个S到底是如何实现http协议安全性的?

         相信如果你自己研究过https相关的东西,一定听说过以下这些概念:对称加密,非对称加密、证书、数字签名,公钥、私钥。。。等等。网上有非常多关于这方面的理论解释,相信每一个概念如果深入研究下去都是一个课题,我们还是按照技术解决问题的思路来梳理一下。

           我们知道了http不安全,那到底如何不安全呢?我不打算像大多数博文一样上图+解释了。我用一个例子来说明一下。前面说过用户和网站的交互就像日常生活中人跟人之间的交流一样。正常人的交流内容如果没有什么要紧的需要保密的,那被别人听到也就听到了,那如果我们需要交流的内容是有隐私的或者需要保密的,那如果被别人听到可能就会有很大问题。电视上谍战剧大家都看过吧,地下接头都是暗号先对一下,这个暗号就相当于一个密码啊,不知道这个暗号或者暗号不对,肯定接不了头。考虑到安全,这个暗号应该只有接头的双方知道,那么问题来了:这个对暗号的方式安全是,那怎么让双方安全的知道暗号呢?也就是一开始其实大家是不知道暗号的,前面用暗号接头的前提是双方已经知道了暗号,并且这个暗号是安全的。 ----https要解决的核心问题,让http通信安全的进行。暗号其实就是对http过程的加密,这种加密的方法就是对称加密方法(用同一个暗号)。

         那么问题来了,如何保证这个暗号的安全呢?直接传递暗号肯定风险太大,万一暗号被偷听泄露了,那之后所有的接头都是不安全的了。

         那为了保证暗号安全,上线可以提供一个预先准备好的箱子给下线用于盛放暗号---这就是公钥   钥匙只有上线那里有---这就是私钥    里面也包含一些能证明上线身份的东西 -----这就是数字证书(公钥+身份证明)    公钥加密,私钥解密----这就是非对称加密

         我拿到这个箱子后,把暗号放到箱子里,锁好,再给上线。这个过程即使有人中间得到这个箱子也没用,因为只有上线那里有钥匙啊。至于有人会说可以撬开箱子啊什么的,那这个就牵涉到箱子的牢固度,放在网络通信里就是算法的强度,说的白点,这个箱子坚固到除了用配套的钥匙打开外别无他法。

          那么问题又来了,数字证书这个方法只解决了通信过程中的安全问题,那双方的身份怎么验证真假呢?下线的的身份验证只要双方都安全的知道了暗号还好说,关键是一开始的放暗号的箱子是上线给的,上线如果是假的,或者被敌方抓住策反了,自然之后所有的接头(通信)都是不安全的了。所以对于安全的保障是基于初始的协商过程的,而不是后续的交流过程,就像前期采取措施保障了环境的安全后,后续在这个环境中就能保住是安全的。(不绝对,理论上得这么推导)。

           回到验证上线身份的问题,这个上线的真假对于下线来说基本无法判断,唯一的方法就是去一个权威的地方核实一下,这个权威肯定是所有人都认可的。----这就是CA颁发机构   有人可能会说,这个权威万一也沦陷了呢? 好吧,其实是存在这个可能的。这个其实就是信任链的问题。如果信任链顶端都有问题,那下面所有的信任都没有基础了,所以数字证书的颁发机构本身的安全相当重要啊!

            上线的身份也验证了,暗号也通过安全的方式进行传输了,看似无懈可击了,那有没有什么问题了呢?细想一下,还有一个地方存在薄弱环节,那就是那个放暗号的箱子,这个箱子其实大家都可以获取到(所以叫公钥),如果这个箱子被掉包,那暗号自然也就泄露了。所以需要对这个箱子进行加固呢。谍战剧里有一个方法,就是对物品做标记,这个标记是很难被仿制或模仿的,即一但有人对这个箱子做了手脚,上线拿回这个箱子一看就知道了。-------这就是数字签名

            下面梳理一下以上提到的,https其实解决了以下几个问题

         1、数据的保密性                             对称加密

         2、对称加密密码传输的安全      非对称加密

         3、服务器身份验证                        数字证书

         4、数字证书的安全                        数字签名

     发现没有,安全的问题都是一环一环的,也许为了解决某个安全问题想了一个办法,但是这个办法本身又有漏洞,于是又要想办法修补这个漏洞,循环往复,直到无懈可击(至少当下看起来是),这其实就是开头所说的技术产生于需求,技术为解决问题而生。你绝对不会看到一个技术毫无用处而被发明出来,如果有,也会迅速被淘汰。