HTTP 与HTTPS

Posted zkccnb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP 与HTTPS相关的知识,希望对你有一定的参考价值。

HTTP 与HTTPS


上一篇提到,基本的HTTP协议是 不安全的,有两个方面:

  • 明文传输,可能被截获、查看甚至篡改。
  • 无法验证服务端的权威性。

针对以上问题,HTTPS对HTTP的安全性进行补充。

一、HTTPS的概念

1. HTTPS的要点/作用

主要可分为以下3个要点:(HTTPS比HTTP多做的事情)

  • **密文传输:**对所有报文数据进行加密,只有通信双方能解密。
  • **篡改校验:**传输报文前用摘要算法对报文形成一套摘要,接受到后用同样的算法生成摘要,验证摘要是否相同。
  • **数字证书:**每次建立连接时通过CA(证书权威机构)验证服务器的数字证书是否合法,来决定是否信任服务器。

2. HTTPS的实现

那么以上三个要点HTTPS是如何实现的呢?如何与原有的HTTP协议结合的呢?

做法是在HTTP协议层下,传输层协议之上插入一层SSL/TLS协议层,专门负责HTTP通信的安全:

图1 基础HTTP与HTTPS的协议栈结构

为啥叫SSL/TLS协议层呢?SSL和TLS有什么区别呢?答案是没啥区别,二者一个意思。。

SSL(Secure Sockets Layer),安全套接层,是上世纪90年代由景网公司先设计的;到了本世纪初,由于SSL在计算机网路中的广泛应用,国际互联网工程任务组(IEFT)将其纳入了计算机网络协议栈中,上升为了一个国际标准协议,协议名称为:TLS(Transport Layer Security),传输层安全协议。

我们知道,基础的HTTP/1.1协议只需通过TCP三次握手即可建立连接开始发送正式的HTTP报文;但是加上SSL/TLS层后,情况变得不一样了。HTTPS和HTTP/2协议在经过TCP三次握手后还需TLS四次握手(TLS1.2)才能建立连接并发送加密的HTTP报文。(你可能会觉得三次握手后还需四次握手才能开始通信,好麻烦。。在下一篇文章中将会看到新版的协议会对握手次数做出优化,这里先掌握最经典的握手方案)

二、 TLS协议原理

TLS1.2协议是经典的一版协议,我们需要很好的掌握其建立连接时做的工作,可以先忽略一些算法层面的细节。(比如摘要算法、随机数算法、非对称加密算法等)

1. TLS协议的基本流程:

  • 客户端向服务器索要证书并验证之
  • 服务器公开公钥给客户端而自己保留私钥,双方利用公钥和私钥产生会话密钥(非对称加密)
  • 利用产生的会话密钥进行加密通信并利用摘要校验数据内容是否被篡改(对称加密)

1.1 证书与公钥的验证

图2 证书与公钥验证

由图2所示,服务器将自己产生的公钥注册到CA,CA经过验证无误后,同样用自己的私钥签发证书给客户端(起到加密作用);客户端收到CA的证书后,用CA的公钥将其解密并拿到服务器的公钥。到此便完成了对服务器证书的验证。

1.2 利用非对称加密原理产生会话密钥

HTTPS使用混合加密进行通信:(非对称加密+对称加密)

图3 HTTPS的混合加密

这张图的上半部分是非对称加密的过程:服务器先通过数字证书将自己的公钥发送给客户端而保留私钥;在产生会话密钥时,客户端使用来自服务器的公钥加密自己产生的随机数而服务器收到后使用私钥解密之取到随机数。这个过程就是非对称加密。

简而言之,非对称加密算法维护一对钥匙:公钥和私钥;并确保经公钥加密过的数据,只有配对私钥才能解开。

可见,服务器与客户端产生会话钥匙过程中必需的通信就是采用非对称加密;同时应该认识到,CA与客户端之间的通信同样采用非对称加密。

1.3 利用对称加密与摘要算法进行安全通信

与上面相反,**对称加密就是双方都采用一个钥匙进行加密和解密。**HTTPS通信的过程就是利用会话密钥进行对称加密的。

双方产生会话密钥后,TLS握手过程也即将宣告结束,正式开始HTTP数据交流。此时双方都利用会话密钥对报文进行加密。

不仅如此,数据发送端还通过摘要算法形成发送数据的摘要信息,把数据+摘要一并发送给对端。对端收到后用同样的摘要算法将自己收到的数据形成摘要,与发送端发来的摘要对比;如果摘要不同,说明数据已被篡改。其过程如图4所示:

图4 摘要算法的工作过程

2. TLS四次握手原理

有了上面的基础,我们可以看一下TLS1.2的四次握手是怎么回事:

图5 TLS1.2的四次握手过程

如图5所示,黄色部分即为TLS的四次握手过程,上面省略了TCP三次握手过程,下面省略了对称加密HTTP报文传输过程。下面逐一讲解每一次握手的数据交流:

  • 握手1:Client Hello(client to server)

    1. 客户端先向服务器发送自己产生的随机数C、本端支持的TLS版本号、和支持的加密算法套件列表

    2. 服务器发送相应的ACK i 报文段(TCP层面)

  • 握手2:Server Hello(server to client)

    1. 服务器接着向客户端发送自己产生的随机数S、TLS版本号确认,加密算法套件确认、服务器的数字证书(内含公钥)

    2. 客户端发送相应的ACK i 报文段(TCP层面)

  • 握手2-握手3之间的过程:(客户端)

    客户端验证服务端的数字证书并取出公钥,同时产生随机数pre-master

  • 握手3:非对称加密发送pre-master(client to server)

    1. 客户端使用来自服务器的公钥向服务器发送随机数pre-master

    2. 与此同时,客户端内部利用随机数C、随机数S、随机数pre-master生成会话密钥

    3. 生成完毕后,向服务器发送“Change Cipher Spec”报文,意味着以后的通信全部采用会话密钥

    4. 服务器发送相应的ACK i 报文段(TCP层面)

  • 握手3-握手4之间的过程(服务器)

    服务器收到加密的pre-master后,使用自己的私钥将其解密(非对称加密)以获取pre-master,然后和客户端一样,利用随机数C、随机数S、随机数pre-master生成会话密钥

  • 握手4:服务器端的“Change Cipher Spec”报文(server to client)

    1. 服务器生成好会话密钥后,同样向客户端发送“Change Cipher Spec”报文,意味着以后的通信全部采用会话密钥。

    2. 客户端发送相应的ACK i 报文段(TCP层面)

    3. 至此,TLS握手结束,建立安全连接

以上是关于HTTP 与HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

浅析https

HTTPS加密原理与过程

apache相关实验-2

http和https的区别?

[安全] HTTPS的理解

[安全] HTTPS的理解