crazyandcoder

计算机网络(https)

2021.07.13

HTTPS协议.png

1 前言

HTTPS 是一种通过计算机网络进行安全通信的传输协议,经由 HTTP 进行通信,利用 SSL/TLS 建立全信道,加密数据包。HTTPS 使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。TLS 是传输层加密协议,前身是 SSL 协议(SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持)。

HTTPS 是在 HTTP 和 TCP 之间建立了一个安全层,HTTP 与 TCP 通信的时候,必须先进过一个安全层,对数据包进行加密,然后将加密后的数据包传送给 TCP,相应的 TCP 必须将数据包解密,才能传给上面的 HTTP。

2 HTTP 协议特点

  1. 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
  2. 无连接:HTTP/1.1 之前,由于无状态特点,每次请求需要通过 TCP 三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
  3. 基于请求和响应:基本的特性,由客户端发起请求,服务端响应
  4. 简单快速、灵活
  5. 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性

3 HTTPS 的作用

  1. 内容加密 建立一个信息安全通道,来保证数据传输的安全;
  2. 身份认证 确认网站的真实性
  3. 数据完整性 防止内容被第三方冒充或者篡改

4 加密方式

HTTPS 在 HTTP 的基础上加了一层 SSL 层,即对内容进行加密,常见的加密方式有两种:对称加密和非对称加密

HTTPS采用的加密方式既包含对称加密又包含非对称加密

4.1 对称加密

对称加密是指双方持有相同的密钥进行通信,加密速度快,但是有一个安全问题,双方怎样获得相同的密钥?常见的对称加密算法有 DES、3DES、AES 等。

4.2 非对称加密

非对称加密,又称为公开密钥加密,是为了解决对称加密中的安全问题而诞生,一个称为公开密钥 (public key),即公钥,另一个称为私钥 (private key),即私钥。但是它的加密速度相对于对称加密来说很慢。

4.2.1 过程

发送密文的一方使用公钥进行加密处理“密钥”,对方收到被加密的信息后,再使用自己的私有密钥进行解密。这样可以确保交换的密钥是安全的前提下,之后使用对称加密方式进行通信交换报文。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。

4.2.2 特点

  1. 公钥是对外开放的,私钥是自己拥有的。
  2. 公钥加密的数据,只能用私钥解密
  3. 私钥加密的数据,只能用公钥解密。
  4. 公钥可以发送给所有的客户端,私钥只保存在服务器端。

4.2.3 缺点

  1. 公钥是公开的,所以针对私钥加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容;
  2. 公钥并不包含服务器的信息,使用非对称加密算法无法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改;
  3. 使用非对称加密在数据加密解密过程需要消耗一定时间,降低了数据传输效率;

5 CA 证书

CA 证书是由 CA(Certification Authority)机构发布的数字证书,称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。其内容包含:电子签证机关的信息、公钥用户信息、公钥、签名和有效期。这里的公钥服务端的公钥,这里的签名是指:用hash散列函数计算公开的明文信息的信息摘要,然后采用CA的私钥对信息摘要进行加密,加密完的密文就是签名。 即:证书 = 公钥 + 签名 +申请者和颁发者的信息。 客户端中因为在操作系统中就预置了CA的公钥,所以支持解密签名。

5.1 实现证书

关于如何生成自己的证书,详细可参考《Android自制HTTPS证书实现双向认证》

6 认证过程

6.1 单向认证

单向认证大体意思就是客户端只验证服务端的合法性。即服务器保存公钥证书和私钥两个文件,客户端获取这个证书里面的公钥生成私钥,服务器端用自己的私钥去解密这个客户端发过来的私钥,后续的 https 通信过程就用这个私钥进行加密。

单向认证过程.png

  1. 客户端发起 HTTPS 请求,将 SSL 协议版本的信息发送给服务端
  2. 服务端去 CA 机构申请来一份 CA 证书,在前面提过,证书里面有服务端公钥和签名。将 CA 证书发送给客户端
  3. 客户端读取 CA 证书的明文信息,采用相同的 hash 散列函数计算得到信息摘要( hash 目的:验证防止内容被修改),然后用操作系统带的 CA 的公钥去解密签名(因为签名是用 CA 的私钥加密的),对比证书中的信息摘要。如果一致,则证明证书是可信的,然后取出了服务端公钥
  4. 客户端生成一个随机数(密钥 R ),用刚才得到的服务端 B_ 公钥去加密这个随机数形成密文,发送给服务端。
  5. 服务端用自己的 B_ 私钥去解密这个密文,得到了密钥 R
  6. 服务端和客户端在后续通讯过程中就使用这个密钥 R 进行通信了。和之前的非对称加密不同,这里开始就是一种对称加密的方式

6.2 双向认证

对于双向证书验证,也就是说,客户端持有服务端的公钥证书,并持有自己的私钥,服务端持有客户的公钥证书,并持有自己私钥,建立连接的时候,客户端利用服务端的公钥证书来验证服务器是否上是目标服务器;服务端利用客户端的公钥来验证客户端是否是目标客户端。 服务端给客户端发送数据时,需要将服务端的证书发给客户端验证,验证通过才运行发送数据,同样,客户端请求服务器数据时,也需要将自己的证书发给服务端验证,通过才允许执行请求。

双向认证过程.png

建立连接的时候,客户端利用服务端的公钥证书来验证服务器是否上是目标服务器;服务端利用客户端的公钥来验证客户端是否是目标客户端。 服务端给客户端发送数据时,需要将服务端的证书发给客户端验证,验证通过才运行发送数据,同样,客户端请求服务器数据时,也需要将自己的证书发给服务端验证,通过才允许执行请求。

  1. 客户端发起 HTTPS 请求,将 SSL 协议版本的信息发送给服务端。
  2. 服务端去 CA 机构申请来一份 CA 证书,在前面提过,证书里面有服务端公钥和签名。将 CA 证书发送给客户端
  3. 客户端读取 CA 证书的明文信息,采用相同的 hash 散列函数计算得到信息摘要(hash 目的:验证防止内容被修改),然后用操作系统带的 CA 的公钥去解密签名(因为签名是用 CA 的私钥加密的),对比证书中的信息摘要。如果一致,则证明证书是可信的,然后取出了服务端公钥
  4. 客户端发送自己的客户端证书给服务端,证书里面有客户端的公钥:C_公钥
  5. 客户端发送支持的对称加密方案给服务端,供其选择
  6. 服务端选择完加密方案后,用刚才得到的 C_公钥去加密选好的加密方案
  7. 客户端用自己的 C_私钥去解密选好的加密方案,客户端生成一个随机数(密钥 R ),用刚才等到的服务端 B_公钥去加密这个随机数形成密文,发送给服务端。
  8. 服务端和客户端在后续通讯过程中就使用这个密钥 R 进行通信了。和之前的非对称加密不同,这里开始就是一种对称加密的方式

7 常见问题

7.1 HTTPS的缺点

7.2 HTTP的工作原理

7.3 HTTPS的工作原理

7.4 SSL与TLS的区别?

7.5 GET方法与POST方法的区别,什么时候应该使用GET,什么时候应该使用POST

7.6 三次握手中,为什么客户机最后还要再向服务器发送一次确认呢?

7.7 为什么需要四次挥手呢?