HTTP 与 HTTPS

本文最后更新于:2024年6月29日 晚上

HTTP 与 HTTPS

HTTP与HTTPS的区别

  • HTTPS协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
  • HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  • HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 SSL握手需要的 9 个包,所以一共是 12 个包。

HTTPS 基本工作原理

  1. 客户端使用 HTTPS 的 URL 访问服务器,要求与服务器建立 SSL 连接,向服务端发送一个随机数(Client random)和客户端支持的加密方法,比如 RSA 公钥加密。
  2. 服务器收到客户端请求后,回复一种客户端支持的加密方法,一个随机数(Server random)和SSL证书(其中包括非对称加密的公钥)
  3. 浏览器通过内置的CA公钥解密证书,并通过数字签名验证收到的证书没有被篡改,随后校验证书是否过期,证书中包含的网址是否与当前访问网址一致等等,验证通过后客户端利用服务端的公钥及加密方法对新的随机数(Premaster secret)进行加密并发送给服务器。
  4. 服务端通过私钥解密出Premaster secret,利用同时利用 Client random,Server random通过一定的算法生成会话密钥(session key)
  5. 此后双方通过会话密钥的对称加密进行通信。

对称加密与非对称加密

  • 对称加密:指的就是加,解密使用的同是一串密钥,所以被称做对称加密,对称加密只有一个密钥作为私钥,常见的对称加密算法:DES,AES等。
  • 非对称加密:指的是加,解密使用不同的密钥,一把作为公开的公钥,另一把作为私钥,公钥加密的信息,只有私钥才能解密,反之,私钥加密的信息,只有公钥才能解密。

HTTPS 的通信步骤

2020042800445749

SSL四次握手

  1. 一次握手。

    • 步骤 1:客户端通过发送 Client Hello 报文开始 SSL通信,报文中包含客户端支持的 SSL的指定版本,加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)
  2. 二次握手。

    • 步骤 2:服务器可进行 SSL通信时,会以 Server Hello 报文作为应答,和客户端一样,在报文中包含 SSL版本以及加密组件,服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。

    • 步骤 3:之后服务器发送 Certificate 报文,报文中包含公开密钥证书。

    • 步骤 4:最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL握手协商部分结束。

  3. 三次握手。

    • 步骤 5:客户端以 Client Key Exchange 报文作为回应,报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串,该报文已用步骤 3 中的公开密钥进行加密。
    • 步骤 6:接着客户端继续发送 Change Cipher Spec 报文,该报文会提示服务器,在此报文之后的通信会采用Pre-master secret 密钥加密。
    • 步骤 7:客户端发送 Finished 报文,该报文包含连接至今全部报文的整体校验值,这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
  4. 四次握手。

    • 步骤 8:服务器同样发送 Change Cipher Spec 报文。
    • 步骤 9:服务器同样发送 Finished 报文。
  5. 总的来说,SSL会话的建立完成了以下几个工作:交换协议版本号,选择一个通信双方都支持的加密方式,对两端实现身份验证,密钥交换。

SSL连接完成后,建立TCP连接,发送HTTP请求

  • 步骤 10:服务器和客户端的 Finished 报文交换完毕之后,SSL连接就算建立完成,通信会受到 SSL的保护,从此处开始进行应用层协议的通信,即发送 HTTP 请求。
  • 步骤 11:应用层协议通信,即发送 HTTP 响应。

通信完成后断开连接

  • 步骤 12:最后由客户端断开连接,断开连接时,发送 close_notify 报文,上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP的通信。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!