一文让你轻松掌握 HTTPS

原文做者:UC 国际研发 泽原
前端


写在最前:欢迎你来到“UC国际技术”公众号,咱们将为你们提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。算法



1、HTTPS 简介

>> 1.1 什么是 HTTPS <<浏览器

HTTPS 称为安全的超文本传输协议,在 HTTP 与 TCP 之间增长了一层安全链路 (SSL/TLS)。(SSL 是 TLS 的前身,在 IETF 将 SSL 标准化后就更名叫 TLS,SSL 的最高版本为 3.0,以后版本为 TLS1.0,TLS1.1,TLS1.2.....)
缓存



>> 1.2 为何要用 HTTPS <<安全

HTTPS 的诞生是为了解决 HTTP 存在的问题,想知道为何要用 HTTPS,就要知道 HTTP 存在哪些问题。HTTP 技术的应用很是的普遍,是一个很伟大的技术,可是因为它是明文传输的,因此存在着各类安全性问题:
网络


  • 窃听风险。因为是明文传输,若是网络传输的某个节点被动了手脚,那么传输的内容就可被窃听。性能

  • 篡改风险。因为是明文传输,在内容被窃听的同时,攻击者能够很容易的篡改传输内容,而 HTTP 自己没有校验报文完整性的能力。测试

  • 冒充风险。没法验证通信方的真实身份。优化


    为了解决这些问题就诞生了 HTTPS,经过加密传输来解决窃听风险,再经过摘要校验确保报文没被篡改,另外为每一个站点配备证书以肯定身份,固然证书还包含了秘钥,摘要算法等信息。加密


>> 1.3 HTTPS 如何确保传输的安全性 <<

加密算法有非对称加密算法对称加密算法摘要算法。因为摘要算法是不可逆算法,没法用于数据传输,非对称加密算法有很高的安全性也是可逆的,可是因为计算很是的耗时 ,若是做为数据传输的加密算法,代价将会很是的高。


而对称加密算法既能知足可逆条件,并且耗时相对非对称加密算法小不少,适合于数据传输。因此 HTTPS 是使用对称加密算法进行数据传输。


为了能将对称加密的秘钥安全的给到客户端,HTTPS 是经过非对称加密算法加密秘钥传输给客户端的。然而,非对称加密的的公钥是明文方式给到客户端的,因此会存在中间人攻击 (介绍) 的状况,为了解决中间人攻击,HTTPS 引入了数字证书。


上面一段介绍看下来,咱们发现要进行 HTTPS 传输,须要不少的信息,非对称加密算法用哪一种算法?对称加密又用哪一种算法?服务端的证书又是什么?客户端跟服务端之间是怎么去协商这些数据的?因而就有了咱们常常听到的 TLS 握手,TLS 握手就是为了肯定这些变量,从而创建所谓的安全链路。以下是 TLS 握手的一个大概过程:


下面咱们经过访问 https://www.baidu.com 的握手过程,讲解一下几个关键环节。


  • Client Hello


Client Hello 是 TLS 握手的第一步,由客户端发起,主要包含几个信息:

一、客户端支持的最高的 TLS 版本号

二、一个随机数,用于后面对称秘钥导出算法

三、客户支持的加密套件列表

四、拓展信息


  • Server Hello

一、根据客户端支持的最高协议版本,肯定使用的 TLS 版本

二、根据客户端支持的加密套件列表,选择使用的加密套件,也就是肯定了秘钥交换算法,数据传输用的对称加密算法等

三、生成一个随机数,用于后面对称秘钥导出算法


  • Server Certificate

返回服务端的证书,这里是一个证书链,包含了中间证书。


  • Server Key Exchange

TLS 的握手过程会根据肯定加密套件,步骤上会有所区别。

若是加密套件选择的是 DH(或者 ECDHE)做为对称秘钥交换算法,那么对称秘钥是由客户端跟服务端本身导出的,这个时候须要客户端与服务端交互各自生成的公钥,就会有 Server Key Exchange 这一步。

若是选择的是 RSA 算法,那么对称秘钥是由客户端生成一个叫 pre-master key 后加密传输给服务端导出秘钥的,那么就没有 Server Key Exchange 这一步。


  • Client Key Exchange

如上面所讲,若是交换算法选择的是 DH(或者 ECDHE),那么这里传输的将是一个公钥,用于服务端生成对称秘钥。

若是交换算法是 RSA,那么这里传输的则是使用服务端公钥加密的 pre-master key。

这一步事后,客户端跟服务端就能导出传输过程当中须要的的对称加密秘钥了。


  • Change Cipher Spec

从上图能够看到,在 Client Key Exchange 后,客户端跟服务端都有一次 Change Cipher Spec 请求。这个步是算法各自根据本身生成的对称秘钥对刚才握手的全部数据的摘要进行加密后传输给对面。一是确保对称算法秘钥的正确性,二是校验握手过程数据是否遭到篡改。




2、证书管理

>> 2.1 什么是证书 <<

上面咱们屡次提到证书这个词,那么什么是证书呢?证书就是网络通信中的一种标识身份的文件,主要包含使用者、非对称加密的公钥、颁发者、颁发者的签名、有效期等信息。


>> 2.2 哪些证书是可信任的 <<

证书是标识身份的文件,那么咱们怎么肯定这个文件是可信任的呢?首先咱们来看一下证书是如何生成与验证的:

如上图,生成一个证书的时候,颁发者(图中的签名者)会先用摘要算法计算出摘要值,而后使用本身的私钥对摘要进行签名即加密,而后一并写入证书中。使用者拿到证书后,使用证书中的摘要算法计算出摘要值,而后使用证书中的公钥对签名信息进行解密获得明文(颁发者计算的摘要),而后对比这两个值,若是这两个值是同样的,则说明该证书内容是没被篡改的。


从上面的内容咱们知道了一个证书的生成与验证过程,然而即便咱们知道了证书的内容是没有被篡改的,咱们也还不能说这个证书就是可信任的,由于有可能这个证书是一个攻击者本身使用本身的秘钥对生成后给到你的。因此咱们必须知道这个颁发者 是不是可信任的,为了验证颁发者是可信任的,这里就引入了证书链的概念,以下图:

咱们在 1.3 章节的 TLS 握手中提过,服务端下发证书的时候是下发了一个证书链,就是会包含 中间证书,因此咱们要确认一个站点证书的颁发者是不是可信任的,就要往上验证颁发者的证书,一层层往上验证。


咱们在验证证书链的时候,要验证到哪一层结束呢?


相信不少人都听过 CA,CA 就是数字证书认证机构,是被全部人承认的,系统跟浏览器会默认安装这个证书以及该证书颁发的二级证书等,这些都是可信任的证书,固然,除了这些,用户还能够手工添加本身认为可信任的证书到信任列表,咱们在验证证书链的时候,若是验证的证书已经在信任列表里面了,那么咱们就认为这个站点证书是可信任的(即便是这样,一些过时的或者算法安全等级不够的,浏览器依然会认为是不安全大的,而发出警告信息)。


以下就是 Chrome 浏览器的信任列表:



>> 2.3 如何撤销证书 <<

出于某些缘由,好比秘钥泄密,或者证书的算法已经不安全等等,这个时候须要对证书进行撤销。通讯双方均可以根据证书中指定的校验地址对证书链中的每一个证书的状态进行校验。目前撤销证书大的方式有两种:


证书吊销列表(CRL),CRL 会按期发布,或每次更新时发布,或经过 HTTP 的方式提供访问,是一个包含了全部撤销证书的名单。这种方式有两个缺点,一是文件会愈来愈大,二是客户端可能会缓存 CRL 文件而致使没办法当即更新刚撤销的证书。


在线证书状态协议(OCSP),一种可实时检查证书状态的机制。



3、加密套件

>> 3.1 什么是加密套件 <<

在介绍 TLS 握手过程的时候,咱们除了说到证书之外,还有一个没解释的名词,就是加密套件。什么是加密套件?以下图:

如上图每一行就是一个加密套件,第一部分为加密套件的名字,后面是对该加密套件内容的介绍。加密套件是确保 HTTPS 安全的基础,主要包含了秘钥交换算法,签名认证算法,对称加密算法,摘要校验算法。


Kx 是密钥交换算法,用于握手中交换对称秘钥时加密秘钥。Au 是签名认证算法,握手过程当中须要对握手内容进行签名验证 。Enc 是对称加密算法,握手成功后数据传输所使用的加密算法。Mac 是摘要校验算法,用于确保报文的完整性。图中有些加密套件 Mac=AEAD,这部分加密套件表明对称加密算法自己能确保报文的完整性,不须要摘要算法。


>> 3.2 如何选择加密套件 <<

选择加密套件,主要从安全性跟性能两个方面去考虑,目前主流的秘钥交换算法是 ECDHE,ECDHE 是在 DH 算法上加上了椭圆曲线算法,在性能跟安全性上都有很大的提高。而对称加密算法主流的是 AES 算法的 GCM 模式,GCM 模式支持加解密并行计算,并且在 intel 处理器上有特殊的优化。


好文推荐:

JS 如何判断是否安装某个 Android APP?



“UC国际技术”致力于与你共享高质量的技术文章

欢迎关注咱们的公众号、将文章分享给你的好友

相关文章
相关标签/搜索