Roger Leung‘s Epcot

vuePress-theme-reco Roger Leung ( z3rog )    2018 - 2021
Roger Leung‘s Epcot

Choose mode

  • dark
  • auto
  • light
Blog
Note
Github (opens new window)
author-avatar

Roger Leung ( z3rog )

18

Article

20

Tag

Blog
Note
Github (opens new window)
  • 首页
  • 框架与工具链

    • Vue 3
    • Vue 2
    • Webpack 4
  • 前端性能优化

    • 性能优化的必要性
    • 性能指标
    • 基本手段
    • 离线缓存
  • 浏览器机制

    • 架构
    • 导航
    • 渲染机制
    • 缓存机制
  • 网络协议

    • TCP 协议
    • HTTP 协议
    • HTTPS 协议
    • HTTP 2 协议
    • HTTP 3 协议
  • 其他

    • V8 中的快慢属性与快慢数组
    • V8 解析执行 JavaScript 流程简述
    • V8 的垃圾回收机制
    • 100 行代码写一个破产版 Vite
    • 浅谈微前端

HTTPS 协议

vuePress-theme-reco Roger Leung ( z3rog )    2018 - 2021

HTTPS 协议

Roger Leung ( z3rog ) 2019-01-08 HTTPSProtocal

HTTPS 协议基础个人总结

# 什么是 HTTPS

HTTPS 是在 HTTP 的基础上,增加了 SSL / TLS 的加密安全层,来实现安全传输的应用层协议,主要目的有:

  • 所有信息加密
  • 完善的校验机制,一旦信息被篡改,通信双方都会立即发现
  • 有证书作为身份的校验准则,防止被冒充

# 什么是 CA

CA 是数字证书的签发机构,具有权威性。当访问的网站有使用 CA 签发的数字证书,我们只需要校验数字证书即可确定对方的真实身份。其工作流程如下:

  • 服务器或域名的拥有者,向 CA 请求 TLS 证书
  • CA 为服务器创建证书,证书需要包含必要的数据,如服务器名称、公钥等
  • CA 将创建证书的哈希值,使用自己的私钥进行加密,存储在自己的数据库中。该数据库安全性要求极高
  • 浏览器和操作系统自带多个 CA 机构的公钥,当浏览器收到证书时,将使用公钥从证书签名生成哈希值,也将使用证书中指定的哈希算法生成证书数据的哈希值,若两个哈希值匹配,则签名验证成功,认为该证书可信
  • 浏览器继续使用证书中指定站点的公钥继续进行身份验证

# SSL / TLS 协议

TLS(Transport Layer Security,传输层安全性协议),及其前身 SSL(Secure Sockets Layer,安全套接层),是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。

HTTPS 协议的安全性由 SSL 协议实现,TLS 协议之于 SSL,类似于 HTTPS 之于 HTTP,你可以认为 TLS 是 SSL 的升级版。当前使用的 SSL 协议普遍使用 TLS 协议的 1.2 版本,而 1.3 版本已经于 2018 年 8 月发布。TLS 包含了四个核心子协议:握手协议、密钥配置切换协议、应用数据协议及报警协议。

# TLS 握手步骤

TLS 与 TCP 类似,也有握手步骤,但 TCP 的握手是连接正式建立前的认证,TLS 的握手是安全性上的认证,只有双方在安全性认证上握手成功了,HTTP 的部分才能正常工作(即成功从 HTTP 协议升级成 HTTPS)。

TLS 握手分单向 TLS 和双向 TLS。两者的区别是:单向 TLS 中只由客户端来校验服务端,通常通过浏览器访问一个 HTTPS 站点时是单向 TLS;双向 TLS 中,服务端也要对客户端进行验证,即所谓双向,服务器去服务器之间需要协作通信时,需要互相确认安全性,那么 TLS 就是双向的。因此,在 TLS 握手过程中,有一些非必须步骤。

tls1.2-handshake

带*号表示可选,上图所示是一个单向 TLS 握手,下述可选步骤都被省略

  • ClientHello:客户端发送所支持的 SSL/TLS 最高协议版本号及所支持的加密算法集合、压缩方法集合等信息给服务端。
  • ServerHello:服务端收到客户端信息后,选定双方都能够支持的 SSL/TLS 协议版本和加密方法及压缩方法返回给客户端。
  • SendCertificate *:服务端发送服务端证书给客户端。
  • RequestCertificate *:如果选择双向验证,服务端向客户端请求客户端证书。
  • ServerHelloDone:服务端通知客户端初始协商结束。

  • ResponseCertificate *:如果选择双向验证,客户端向服务端发送客户端证书。
  • ClientKeyExchange:客户端使用服务端的公钥,对客户端公钥和密钥种子进行加密,再发送给服务端。
  • CertificateVerify *:如果选择双向验证,客户端用本地私钥生成数字签名,并发送给服务端,让其通过收到的客户端公钥进行身份验证。(以上证书验证阶段使用非对称加密)
  • CreateSecretKey:通讯双方基于密钥种子等信息生成通信密钥。
  • ChangeCipherSpec:客户端通知服务端已将通讯方式切换到加密模式。
  • Finished:客户端做好加密通讯的准备。
  • ChangeCipherSpec:服务端通知客户端已将通讯方式切换到加密模式。
  • Finished:服务端做好加密通讯的准备。

  • Encrypted/DecryptedData:双方使用客户端密钥通过对称加密算法对通信内容加密解密,来回传输数据(数据传输阶段使用对称加密)。
  • ClosedConnection:通讯结束后,任何一方发出断开连接的消息。