Skip to content

HTTPS #2

Description

@zerofront

Web业务层相关的,普通人在网上的一切行为活动,都可以归结为:向服务器发送信息或者接受来自服务器的信息。

本文主要收集HTTP与HTTPS的信息

不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。
(1) 窃听风险(eavesdropping):第三方可以获知通信内容。
(2) 篡改风险(tampering):第三方可以修改通信内容。
(3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL(Secure Sockets Layer)/TLS(Transport Layer Security)协议是为了解决这三大风险而设计的,希望达到:
(1) 所有信息都是加密传播,第三方无法窃听。
(2) 具有校验机制,一旦被篡改,通信双方会立刻发现。
(3) 配备身份证书,防止身份被冒充。

过程:

  1. 客户端先向浏览器发出加密通信的请求( ClientHello )。在这一布,客户端主要向服务器提供以下信息。

    • 支持的协议版本。(比如TLS1.0版本)
    • 客户端生成的随机数,用于生成“对话密钥”
    • 支持的加密方法
    • 支持的压缩方法
  2. 服务器回应 ( ServerHello )

    • 确认使用的加密通信协议版本,比如 TLS1.0 版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
    • 一个服务器生成的随机数,用于生成对话密钥
    • 确认使用的加密方法,比如RSA公钥加密
    • 服务器证书
  3. 客户端回应

    • 客户端收到服务器回应后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信
    • 向服务器发送以下三项消息
    • 一个随机数。该随机数用服务器公钥加密,防止被窃听
    • 编码改变同之,表示随后的信息都将用双方商定的加密方法发送
    • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
  4. 服务器最后回应

    • 服务器接受到客户端的第三个随机数pre-master key 之后,计算生成本次会话的“会话密钥”。然后,向客户端最后发送下面的信息
    • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
    • 服务器握手结束通知,表示服务器的握手阶段已经结束了。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验
  5. 整个握手阶段结束,接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议。不过会使用这次生成的“会话密钥” 加密内容。整个过程详见下图

参考

图解SSL/TLS协议
HTTPS explained with carrier pigeons
HTTPS的故事

FAQ

  1. 为什么需要三个随机数
    首先,这三个随机数是用于生成对话密钥(对称密钥),问题在于SSL协议不信任每个主机都能产生完全随机的随机数。
  2. HSTS
  3. DH算法
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions