Skip to content

HTTPS #2

@zerofront

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算法

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions