[网络]带你通俗了解HTTPS

569 阅读8分钟

本人由于做的事情太杂,最近想重新系统地整理一下前端的知识,因此写了这个专栏。我会尽量写一些业务相关的小技巧和前端知识中的重点内容,核心思想。

前言

本期的网络系列我们来看看HTTPS,我们在日常工作中肯定都会用到https。相信绝大多数的朋友都知道HTTPS是HTTP的安全版,可是具体是怎么个安全法?其实涉及到安全问题,可以引申出很广,很深的内容。但今天我们只针对HTTPS,尽可能通俗地解释一下。

HTTPS是协议吗?

在网络上搜索资料时,会看到有人把HTTPS叫HTTPS协议(全称:Hypertext Transfer Protocol over Secure Socket Layer),这种叫法不能说是错的。但严格来说HTTPS不是一个新的独立协议,他是HTTP协议加上安全协议(SSL/TLS)的统称。

其中SSL是个加密套件,负责对HTTP的数据进行加密。TLS是SSL的升级版。现在提到HTTPS,加密套件基本指的是TLS。

HTTPS在网络模型中的定位

我们前面的文章用四层模型来解释我们现在的网络结构,如果现在加上HTTPS,它是属于那一层呢?如果还用四层模型来阐述,它属于应用层。但是定位介于HTTP协议和TCP协议之间。

HTTP协议还是用于应用数据的定义,TCP还是用于数据传输。在不修改二者内容的前提下,加入了一层会话层。从HTTP过来的数据先经过它的加密,再通过TCP传输。返回的数据也同理,先解密,再给HTTP正常阅读。

我们需要网络安全

要知道HTTP从一开始设计的时候只是单纯为了可以跨网络远距离地从另一台机器获取一个文档(document)。但随着网络技术的发展,包括HTTP/1的出现(像post请求等)。我们实际上有了更多的玩法,页面不在是一个简单文档,他可以是一个平台,甚至是一个应用。我们需要为每个用户都定制他的内容,也就是用户管理,因此用户的数据,理所当然不应该被其他人知道。

由此我们产生了数据不能被人盗取的安全需求,而HTTPS就是问题的解决方案。

HTTPS做了什么?

要真正的了解HTTPS,我们得先知道它究竟做了什么。而在查阅大量资料之后我们会发现,了解HTTPS的过程就像是一个与网络黑客不停过招的过程。所以我们暂时从网络黑客的角度,思考一下,如果想要盗取一个用户的密码,我们可以怎么做?

  1. 最好的办法当然是让用户自己把密码给我。我们可以想办法让用户把登录的请求发到我们搭的服务上,这样自然就可以得到用户的密码了。
  2. 如果用户不肯告诉我,我自己偷不就好了?http是明文传输的,我们只要想办法在他们客户端与服务端连接之间,拦截一下请求,就可以拿到明文内容了。

由上面的内容,其实已经可以得知HTTPS做的内容其实就是围绕着2点。

  1. 确保用户请求的服务是对的。
  2. 为敏感明文内容加密。

证书

怎么可以肯定我们访问的服务是不是真正我们想要访问的那一个?相信没什么比官方认证更可信的办法了。而HTTPS确实是这么解决的。这些颁发证书的机构叫CA(证书颁发机构),这种机构大大小小有很多,但只有极少几家被是公认的权威。比如VeriSign

服务端搭建网站时,可以向CA缴费,申请一个证书。这样客户端在访问服务时,就可以用证书来证明自己的正宗的了。

加密

常见的加密方式主要分为2种:

对称加密

指加密数据用的密钥,跟解密数据用的密钥是一样的。优点是加密、解密效率通常比较高。缺点是数据发送方、数据接收方需要协商、共享同一把密钥,同时确保密钥不泄露给其他人,但这个难度是很大的。

非对称加密

指加密数据用的密钥(公钥),跟解密数据用的密钥(私钥)是不一样的。公钥加密的内容只能用私钥解密,同理私钥加密的内容只能用公钥解密。公钥是公开的,大家都可以拿到用作加密。

HTTPS用的是对称加密与非对称加密2者结合的方案,充分利用两者的优势。

二者结合

现在证书和加密都有了,可是仔细想想就会发现,其实两种方式都是有漏洞的。证书本身是可以伪造的,用户怎么知道证书本身是不是真的?加密的公私钥怎么同步,怎么确保密钥不被人盗取?

显然二者结合才是最好的解决方式。

证书的鉴别

证书这部分的内容实际上是很复杂的,这里只作简单的描述。有兴趣深入的朋友可以自行查阅。

证书格式

证书格式有一个统一的规范,证书中有许多内容:

  1. 包含了颁发证书的机构的名字 -- CA
  2. 证书内容本身的数字签名(用CA私钥加密)
  3. 证书持有者的公钥
  4. 证书签名用到的hash算法

如果连格式都不对的证书,就一定是假的证书了。

数字签名

先来说说数字签名,它是证书鉴别的一个手段。他是由传输的内容截取一部分,用证书上的hash算法,算出一段【摘要】,再用证书密钥加密成的。

明文 --> hash运算 --> 摘要 --> 私钥加密 --> 数字签名

这样生成出来的数字签名就只有CA公钥可以解密了。

根证书

首先CA机构本身也是有密钥的,也就是CA公钥。现在大型的权威CA机构的公钥都默认内置在我们的浏览器中(根证书),我们也可以在设置中看到。而根证书应该是可以解密由自己颁发的证书的摘要的。

鉴别流程

https请求在发出后,服务端会返回自己的证书。这时浏览器会做以下的事情:

  1. 看证书格式是不是对的。
  2. 看证书的CA机构证书在不在浏览器内。
  3. 如果用CA公钥解不了证书摘要,就说明是假的证书。
  4. 如果用CA公钥解密出来的摘要A与用证书上的hash算法生成的摘要B不同,说明证书被改过。

总的来说,证书就是通过数字签名防止证书造假,通过摘要防止证书篡改。同时用CA证书内置的方式,确保证书的权威性。

加密过程

前面有提到HTTPS的加密用的是对称加密与非对称加密2者结合的方案。下面来具体看看是怎么做的。

  1. 客户端拿到证书(公钥A)之后,用本地的一个随机生成的密钥(密钥B)与证书对称加密,这样就能得到一个只有公钥A对应的密钥A才能解密的密钥C。
  2. 客户端把密钥C交给服务端。
  3. 服务端拿到密钥C之后用自己的密钥a解密,得到密钥B。
  4. 这样就客户端与服务端都有密钥B了。
  5. 之后两者的http通讯都用这个密钥B进行对称加密解密。

这样就能确保这个密钥智能真实的客户端和服务器才能读懂。

图解

我做了一张图希望可以帮助大家理解:

HTTPS的缺点

不难发现,尽管HTTPS大大地提高了安全指数,可是现在还是有很多网站没有用HTTPS。说明它还是有缺点的,主要有以下:

  1. 加密动作会消耗更多cpu和服务器资源
  2. 并不是所有内容都需要加密的
  3. 申请证书是需要定期给CA机构缴费的,会增加支出。

对TCP连接的影响

加入了TSL会对TCP连接有影响吗?整体上是没有的,证书的下发和密钥的协商是在握手阶段完成的。双方拿到密钥之后,在http通讯阶段只要加解密就行了。

总结

HTTPS是涉及安全的内容,要完全搞懂需要我们了解很多不同知识。本文旨在把最核心的流程和原理讲述。

参考

segmentfault.com/a/119000000…

developer.mozilla.org/en-US/docs/…

www.cnblogs.com/ttltry-air/…