你的浏览器不支持canvas

Love You Ten Thousand Years

HTTPS加密通信

Date: Author: M/J

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自小可嗒嗒的博客

在《图解 HTTP》书中,我们了解到为什么需要使用到安全的 HTTPS 通信。

  • 通信使用明文会被窃听。所以进行加密处理防止被窃听,通过 SSL(Secure Socket Layer,安全套接层) 或 TLS(Transport Layer Security,安全层传输协议)组合使用,加密 HTTP 通信内容。
  • 通信方的身份可能遭遇伪装,HTTP 协议中的请求和响应不会对通信方进行确认。这个由 SSL 提供的数字证书来解决。
  • 无法确认报文的完整性。

SSL

SSL 是独立于 HTTP 的协议,HTTPS 实际上就是在应用层(HTTP)和传输层(TCP)之间加了一层 SSL/TSL。

所以 HTTP 的做法就是,通过 SSL 建立安全的通信线路,然后在这条线路上进行 HTTP 通信。

SSL 采用一种叫做公开密钥加密的处理方式。

共享密钥加密

加密和解密使用同一个密钥的方式就叫做共享密钥加密,也叫对称密钥加密。使用这种方式加密必须将密钥也发送给对方。可是在互联网上进行转交,这是危险的。

公开密钥加密

公开密钥加密采用一对非对称的密钥。分别叫做 private key 和 public key。方式是,发送密文的一方使用对方的 public key 进行加密处理,对方收到加密的信息后,再使用自己的 private key 进行解密。

HTTPS 采用混合加密方式

HTTPS 采用上述两种结合的加密方式。

  1. 使用 public key 加密方式安全地交换再稍后的共享密钥加密中要使用的密钥。
  2. 确保交换的密钥是安全的前提下,使用共享密钥方式进行通信。

public 密钥加密处理起来比共享密钥加密方式更复杂,所以在通信时使用公开密钥加密,效率就很低。

证明公开密钥正确性的证书

公开你要加密的方式的问题是,无法证明公开密钥本身就是正确的公开密钥,所以使用由数字认证机构颁发的密钥证书。


HTTPS 的工作流程

整个过程分为一下几个步骤:

  • 验证证书的有效性
  • 握手生成会话密钥
  • 利用会话密钥及逆行内容传输
  1. 客户端发出请求 客户端先向服务器发出加密通信的请求,被称作 ClientHello 请求。在这一步,客户端主要向服务器提供以下信息:
    • 支持的协议版本,比如TLS 1.0版
    • 一个客户端生成的随机数,稍后用于生成“对话密钥”
    • 支持的加密方法,比如RSA公钥加密
    • 支持的压缩方法
  2. 服务器回应 服务器收到客户端请求后,向客户端发出回应,被称作 ServerHello
    • 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版一致,服务器关闭加密通信
    • 一个服务器生成的随机数,稍后用于生成“对话密钥”
    • 确认使用的加密方法,比如RSA公钥加密
    • 服务器证书。
  3. 客户端验证证书 客户端收到服务器回应以后,首先验证服务器证书。
  4. 客户端回应 如果证书没有问题,客户端就会从证书中取出服务器的 public key。然后,向服务器发送下面三项信息:
    • 一个随机数
    • 编码改变通知
    • 客户端握手结束通知
  5. 生成会话密钥 步骤 4 生成的是整个握手阶段出现的第三个随机数,又称 pre-master key。客户端就同时拥有了三个随机数,接着就用事先商定的加密方法,生成本次会话所用的同一把“会话密钥”。 服务器收到客户端的第三个随机数之后,也生成本次会话所用的同一把“会话密钥”。
  6. 服务器的最后回应 服务端生成“会话密钥”后,向客户端最后发送下面信息:
    • 编码改变通知,表示随后的信息将用双方商定的加密方法和密钥发送。
    • 服务器握手结束通知,表示服务器的握手阶段已经结束。 至此,整个握手阶段全部结束。接下来,客户端和服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过“会话密钥”加密内容。

参考:


对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。