这个周末阅读了一些关于HTTPS的资料,再结合一些自己的理解,这里记录下我对HTTPS最新的理解。

首先,先列出和HTTPS相关的知识点

  • SSL/TLS
  • 对称加密、非对称加密、公钥私钥
  • 数字摘要,数字签名
  • 数字证书

另外,列出HTTPS的步骤

  • 握手阶段(建立安全连接,非对称加密、数字摘要、数字签名、数字证书都是在这个阶段出现)
  • 通信阶段(这个阶段进行简单的对称加密通信)

从上面的梳理不难看出,我们接下来讲到的很多概念,都是出现在握手阶段。接下来让我们从基础开始。

一、HTTP HTTPS SSL/TLS的概念

如果网络通信只基于HTTP协议,信息是明文传输的,HTTP协议结合SSL/TLS协议后,就能实现加密的网络通信,这种通信协议也就是HTTPS协议。HTTPS协议的加密工作就是由SSL/TLS协议完成。

SSL/TLS层是介于应用层(HTTP就在这一层)和TCP层的传输安全层,下图是来自《HTTP权威指南》一书的截图

SSL/TLS

SSL的全称是:Secure Sockets Layer;TLS的全称是:Transport Layer Security

那么SSL和TLS有什么关系呢?很简单,TLS是SSL的升级版本。最开始NetScape公司设计了SSL协议,后来互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS。

综上所述,我们可以知道,HTTPS相比于HTTP,就是多了SSL/TLS这一层,所以我们接下来讨论的HTTPS的特点,其实就是SSL/TLS的特点。

二、关于加密的基础

关于加密,首先得知道一个概念,密钥是加密算法的一个参数,密钥就像调用一个函数时输入的参数。而HTTPS中使用的加密算法基本公开的,所以加密的安全性取决于你对密钥的管理和保护。

HTTPS中涉及到的加密算法,包括以下三种。

  • 对称加密:DES,Triple-DES,RC2,RC4等
  • 非对称加密:RSA等
  • 不可逆加密:SHA-1,MD5等

接下来一一介绍这三种算法的特点以及应用场景

对称加密

密钥成对出现,而且两个密钥相同,两个密钥之间可以相互加密解密,对称加密的缺点在于维护密钥很麻烦,如果N个节点间相互通信,则每个节点需要给其他(N-1)个节点颁发一个唯一的密钥,所以一共需要产生N*(N-1)个密钥,管理成本很高。而接下来讲到的非对称加密对密钥的管理就容易多了。

另外,由于加密解密的密钥相同,所以,如果A需要和B、C两个人通信,则A需要给B和C颁发不同的密钥,否则B和C之间可以解密你发给他们任何一个人的信息。所以对称加密是一对一的,而下面即将讲到的非对称加密则是一对多的。

对称加密有一个优点,它的计算速度相比非对称加密更快。

非对称加密

密钥成对出现,而且两个密钥不同,一个叫公钥,一个叫私钥,公钥可以有多个,私钥则只能有一个。私钥一般存储于服务器,而公钥则是公开的,每个人都可以从服务器获取一把公钥。

非对称加密管理密钥很简单,服务器持有一把私钥,所有客户端可以从服务器请求获得一把公钥,大家获得的公钥都是相同的,公钥加密的信息只能由私钥解密,所以,虽然所有客户端的公钥相同,也不同担心他们解密其他人的信息。很明显,相比于对称加密的一对一关系,非对称加密是一对多的关系。

非对称加密有一个缺点,就是相比于对称加密,速度比较慢。

从上面的介绍,我们知道对称加密和非对称加密各有优点缺点,对称加密优点在于速度快,非对称加密优点在于管理密钥更方便,所以HTTPS扬长避短,在不同阶段使用这两种算法。HTTPS开始建立连接时,进行几次握手,这个过程使用非对称加密,这个过程完成后,客户端和服务器就会持有一个相同的密钥,接下来使用更快的对称加密进行通信。

好,回头看看文章开头讲到的HTTPS的两个阶段:握手阶段(建立通信阶段)和通信阶段。其实HTTPS的很多概念,诸如数字摘要,数字签名,数字证书,都是在握手阶段出现的,通信阶段只是简单的对称加密而已。

公钥私钥关系进一步理解

上面我们讲到对称加密的两个密钥可以相互加解密,那么非对称加密的公钥和私钥呢?它们可以相互加解密吗?

答案是可以,首先私钥由服务器使用,公钥由客户端使用,一般有以下两种场景使用公钥私钥

  • 客户端使用公钥加密数据,服务器使用私钥解密数据
  • 服务器使用私钥进行签名(涉及私钥加密),客户端使用公钥进行认证(涉及公钥解密)

这里提到的签名和认证,在接下来会讲到。我们先理解这一点,非对称加密中,公钥私钥是可以相互加密解密的

另外,非对称加密的实现原理,其中一步是生成两个不同的密钥,这两个密钥谁都可以当密钥和私钥,不过被选择作为私钥的一方,必须只能有一份,并且进行妥善管理,而公钥则可以公开。既然最初两个不同密钥,谁都可以当公钥和私钥,那么从这一点也可以侧面证明,公钥私钥是可以相互加密解密的,

非对称加密

非对称加密指HASH,MD5之类的不可逆算法,明文执行一次HASH算法生成数字摘要,数字摘要再进一步使用服务器的私钥生成数字签名。接下来会讲到这个流程。

三、数字摘要,数字签名、数字证书

握手阶段,服务器拥有公钥和私钥,各个客户端可以从服务器申请获得公钥,握手阶段的最终目的是让服务器和客户端拥有一个相同的密钥,这个相同的密钥用于通信阶段的对称加密。

握手阶段,主要需要关注以下几个问题

  • 信息在发送过程是否被篡改
  • 通信的对象是否是第三方假冒的(中间人攻击)
  • 最终生成的对称密钥安全可靠

HTTPS的握手阶段就是围绕以上风险进行设计的。

数字摘要和数字签名

我们先来介绍数字摘要和数字签名在握手阶段是如何应用的。数字摘要是报文调用诸如HASH、MD5等不可逆算法产生的摘要信息,而数字签名是数字摘要使用私钥加密后的结果。数字摘要和数字签名主要用于检验信息是否被篡改,其工作原理如下

  • 客户端获取来自服务器的公钥
  • 服务器准备好一段报文(明文,未加密),使用HASH函数等不可逆算法从报文中生成数字摘要,使用私钥对数字摘要加密生成数字签名,带在报文末尾
  • 服务器发送带有数字签名的报文给客户端
  • 客户端收到报文,取下数字签名,并使用公钥对数字签名解密,得到数字摘要A
  • 客户端将数字签名取下后,从报文中生成数字摘要B,与上一步中的数字摘要A对比,如果不同,则报文可能被篡改过,或者服务器是第三方假冒的。

下图是来自《HTTP权威指南》一书对数字签名的解释

数字签名

前面我们提到非对称加密中,公钥和私钥可以相互加密解密,数字签名这里验证了其中一种情况:私钥加密,公钥解密

从上面列举的情况看来,似乎客户端和服务器的通信已经很安全了,其实不然,如果客户端在向服务器请求公钥时,某个第三方假冒者冒充了服务器,客户端获得了一把假冒的公钥,然后接下来的通信中,客户端以为这个假冒者就是服务器。假冒者用它自己的私钥加密生成数字签名,然后你用假冒者提供给你的公钥解密数字签名后,会验证到签名是正确的。这就是所谓的中间人攻击,所以,数字签名并不能避免中间人攻击。

为了应对中间人攻击,我们需要使用数字证书。

数字证书

从上面我们看出,客户端和服务器可能遭受中间人攻击的原因是:客户端想从服务器获取公钥时,却拿到了一个冒充的公钥。

为了解决这个问题,服务器可以将公钥放在数字证书中,然后传给客户端,客户端认证证书后,则信任这把公钥,否则停止通信。接下来开始解释数字证书的工作原理。

数字证书中一般带有一些服务器的相关信息,通信所需的相关信息,以及服务器的公钥,然后将这些信息生成数字摘要,再使用证书颁发机构的私钥加密生成数字签名。最终,由前面提到的服务器的相关信息,通信所需的相关信息,服务器的公钥再加上生成的数字签名,做成了数字证书。

下图是来自《HTTP权威指南》一书对数字证书结构的图解

证书结构

全球的证书并还未有一个同意的标准规定证书中需要包含哪些字段,但是目前大多人使用的规范是X.509 V3.没错,这个经常看到的很玄的名字仅仅代表一种证书结构。

客户单获得这个服务器的数字证书后,开始进行验证,验证过程就像前面提到的数字签名认证流程类似,不过,这回客户端使用了一把证书颁发机构的公钥,客户端一般都会预先安装很多权威的证书颁发机构的证书,其中就带有这时派上用场的公钥。

下图是来自《HTTP权威指南》一书对数字证书认证流程的图解

证书认证流程

到此为止,介绍完了数字签名和数字证书的概念,如果你还对这两个概念有所疑问,推荐一篇阮一峰的文章,可以辅助理解这两个概念

http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

四、HTTPS握手阶段

前面讲过,HTTPS的重点在握手阶段,前面讲到的数字签名和数字证书等概念也是在握手阶段发挥作用,握手阶段一共有四步,接下来大概写一下HTTPS的四次握手

  • 客户端发送一个随机数A,以及描述自己所支持的加密算法
  • 服务器收到客户端信息后,生成随机数B,并发送数字证书(证书中带有公钥),并使用HASH生成数字签名,供客户端校验
  • 客户端收到服务器信息后,验证签名和证书,拿下公钥,生成随机数C,使用公钥加密随机数C,发送给服务器(并进行了数字签名,供服务器校验)
  • 服务器收到客户端信息后,用私钥解密获得随机数C,发送握手结束通知给客户端(并进行了数字签名,供客户端校验)

通过以上四次握手,客户端和服务器都获得了3个随机数,接下来双方都使用这三个随机数生成一个对称密钥,双方接下来的通信就使用这两个相同的对称密钥进行对称加密。

到此为止,如果你对HTTPS的握手阶段理解还不够清楚,推荐两篇文章,依然是阮一峰的。

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

五、参考