测试基础 为什么抓包 https 需要安装代理工具的证书

测试新人 · 2024年04月07日 · 最后由 日积跬步 回复于 2024年04月08日 · 4033 次阅读

背景知识

▧▧ 理解 https 前需要了解的前置知识

加密技术

  • 对称加密: 指的是加密和解密,都是使用同一个密钥,优点是速度快、效率高。缺点是接收方和发送方任一方密钥被泄露都会让加密信息不安全,不适合在互联网上传输密钥,密钥维护的工作量大

  • 非对称加密:指的是密钥对的形式,分为公钥和私钥。使用公钥加密的信息只能用私钥解密,反过来使用私钥加密的信息也只能用公钥解密。优点是公钥与私钥无法互推,适合在互联网上传输公钥。用户密钥维护量少,每个用户只需要一个非对称密钥对。缺点是加密效率低

  • 两种加密方式配合使用: 使用对称密钥加密信息内容,然后用私钥加密对称密钥,用户拿到信息内容后用公钥解密对称密钥,再用对称密钥解密消息内容。通过两种加密方式的套用,抵消了各自的缺点

  • 加密安全:
    - 加密方式无关安全强度,决定安全强度的是密钥的长度
    - 解密成本也是安全强度的一种,当解密成本大于解密后的收益,也是安全性强的体现
    - 密码有效期小于最快的破解时间也是密码强度的体现



数字签名

相当于指纹,一种用于确保数字信息完整性、认证身份和防止否认的技术手段。如:根据散列函数对消息体生成一个 256 位的摘要 A(如 HS256),然后使用私钥对该摘要进行加密生成数字签名。用户收到消息后用公钥解密得到摘要 A,然后根据同样散列函数对消息体生成一个摘要 B,通过对比两个摘要,确认消息体是否被篡改。

.▧▧ 引用下 pity 里的一个函数,这里使用 JWT 提供了一种轻量级的方式来实现数字签名的功能,用于确保 token 的完整性和真实性,本质和数字签名的思想类似,但是 JWT 用的是对称密钥。

  • 在创建 token 时,将数据和密钥输入到散列函数(如 HS256)中,生成一个固定长度的哈希值(签名)
  • 在解析 token 时,按 . 分割,提取出头部、载荷和签名部分,将头部和载荷数据进行 Base64 解码,得到原始的 JSON 数据,使用相同的密钥和算法对原始的 JSON 数据进行签名,得到一个新的签名值,将新计算得到的签名值与从 JWT 中提取的签名部分进行比对,如果两者相同,则表示 JWT 是有效的;否则,表示 JWT 已被篡改或无效
  • 另外 ExpiredSignatureError 只返回时间过期的报错,还有无效 token 的情况没有分类出来,需要加上 ” except InvalidTokenError“

数字签名这里虽然可以防止消息是否被篡改,但是有个关键点,就是无法保证公钥是否被替换过或者公钥是否属于当前请求的服务器



数字证书

  • 数字证书是什么

    • 数字证书简称为证书,它由证书授权中心(CA)颁发并进行数字签名,以确保其真实性和可信度。证书包含了拥有者的公钥以及与其相关的身份信息,如姓名、电子邮件地址、组织、有效期等。
    • 以 testerhome 的数字证书为例,在证书上能看到【版本】【序列号】【签名算法】【颁发者】【有效期】【主体】【签名】 等信息,testerhome 看得出还是比较穷的,申请的是知名免费的 Let's Encrypt 证书颁发机构颁发的免费 SSL 证书,免费的证书有效期是 90 天,这里可以看到 5 月 10 号就要过期了。

  • 为什么需要数字证书

▧▧ 类似身份证是由公安机关签发的一样,主要作用是用于验证网络通信中的身份和信息的真实性。数字证书最核心的作用就是第三方权威机构证明这个公钥持有者是属于谁的

  • 数字证书的应用

    • 在 TLS 握手过程中,客户端使用本地的信任证书列表验证服务器的证书是否有效,以 testerhome 为例大致过程如下
      • 1. chrome 从 testerhome 的 SSL 证书中提取出服务器的数字签名
      • 2. chrome 使用本地信任证书列表(通常是操作系统或浏览器预装的)中的根证书,这些证书包含了可信任的证书颁发机构的公钥。像 testerhome 的就使用根证书的公钥对 testerhome 数字证书进行解密,得到哈希值 A
      • 3. chrome 使用与 testerhome 服务器证书中相同的哈希算法(teserhome 是 SHA-256)对服务器中的公钥、有效期、颁发者等信息进行哈希计算,得到一个哈希值 B
      • 4. 如果 A 和 B 两个值相同,则证明服务器证书的数字签名是有效的,未被篡改,里面的公钥也确定是 testerhome 的



http 的缺陷

▧▧ http 是明文传输协议,数据传输过程中是以纯文本的形式进行传输。这里的明文指的是未经过加密的数据,这些未经过加密的 http 报文(请求行、请求头、主体)在网络上传输的过程,使得其内容容易被窃听者截取和读取。

  • 举例 pity 登录接口,用 http 进行请求,对网卡进行抓包能得到传输的数据


SSL 和 TLS

▧▧ 背景: SSL 最初由网景公司 (Netscape) 开发,用于保护网络通信中的隐私、身份验证和数据完整性。SSL 的安全性存在一些漏洞和弱点,经过多次迭代增强安全性,在 1999 年更新为 TLS。由于 SSL 的最终版本(3.0)与 TLS 的第一版本之间并无明显差异,且这两个术语经常互换使用并混为一谈,现在仍然有人使用 SSL 来指代 TLS,或者使用术语 “SSL/TLS ”,所以 SSL 证书(技术上也称为 “TLS 证书”)。

  • 从上图知道,SSL 层夹在应用层和传输层中间,主要分为两层

    • SSL 记录协议(SSL Record Protocol ): 负责将高层协议(如 HTTP)的数据进行分割、压缩 解压缩、加密解密、认证,然后交给传输层协议(如 TCP)进行传输,确保数据的安全性和完整性(MAC 校验)。
    • SSL 握手协议(SSL Handshake Protocol):SSL 握手协议位于 SSL 协议栈的上层,负责在通信双方建立安全的通信连接之前进行身份验证、协商加密算法和生成会话密钥等操作。
      • SSL 密码参数修改协议(SSL Change Cipher Spec Protocol):SSL 密码参数修改协议是 SSL 协议栈中的一个子协议,用于通知对方从握手阶段的初始加密状态切换到加密通信状态。它主要包括一个特殊的消息类型 ChangeCipherSpec,该消息指示在此消息之后的所有数据都将使用新的加密参数(如会话密钥)进行加密和解密
      • SSL 告警协议(SSL Alert Protocol):SSL 告警协议用于在 SSL 连接中传递警告和错误信息


信息安全

▧▧ 信息安全的基本要素:保密性、完整性、可用性、可控性、不可否认性。很明显 http 协议不具有信息安全的要素特征,因此使用 http + ssl 来保证 http 协议传输的安全性,http 是第一个使用 SSL 保证安全性的应用层协议



https

给 pity 加下证书,

用 postman 发起登录请求,用 wireshark 抓包

在进行 HTTPS 请求时,客户端会在 SSL/TLS 握手过程中获取服务器的公钥和数字证书。SSL/TSL 是一种用于保护通信安全的协议,它在建立安全连接时使用了公钥加密技术。TLS 握手包括以下步骤:

1.客户端发送 ClientHello 消息:客户端向服务器发送一个包含支持的 TLS 版本、加密算法和其他相关信息的 ClientHello 消息。

2.服务器发送 ServerHello 消息:服务器从客户端的支持列表中选择一个 TLS 版本、加密算法等,并将其作为 ServerHello 消息的一部分发送回客户端。

3.服务器发送数字证书:服务器会将其数字证书发送给客户端。数字证书中包含了服务器的公钥以及其他身份验证信息,比如服务器的域名等。

4.验证数字证书:客户端会验证服务器发送的数字证书,确保其合法性。这个过程包括检查数字证书的签发者、有效期、域名等信息,并验证证书链的完整性。

5.生成对称密钥:客户端会生成一个对称密钥,并使用服务器的公钥加密后发送给服务器,以便服务器之后能够使用私钥解密。

6.握手完成:TLS 握手完成后,客户端和服务器就可以使用对称密钥进行加密通信了。



为什么代理工具能抓到包

  • 原理:基于代理服务器和中间人攻击

  • 以 Fiddler 为例,Fiddler 在计算机上安装了自己的根证书(Fiddler Root Certificate),然后将这个根证书当做受信任的证书。当用户通过 Fiddler 代理访问 HTTPS 网站时,Fiddler 将使用自己的根证书替代原始网站的 SSL 证书,建立一个与用户计算机之间的加密通道。大致流程如下:

    • 1. 本地系统信任了 fiddler 生成的自签名证书,配置了 fiddler 的代理。接着在 chrome 上发起 https 请求
    • 2. fiddler 代理收到 TLS 握手请求,根据请求的地址生成临时证书,该证书用 Fiddler 的根证书 (也就是你信任的那张) 进行签名,再发送给 chrome
    • 3. chrome 检验证书通过后,与服务器(即代理服务器 fiddler)协商出对称密钥 会话密钥 A
    • 4. TLS 握手完成后,chrome 使用会话密钥 A 加密应用层数据发给 fiddler
    • 5. fiddler 使用会话密钥 A 解密数据,并以客户端身份与服务器建立了 TLS 连接并协商出了会话密钥 B,把解密出的数据用会话密钥 B 加密后发给服务器
    • 6. 服务器收到 fiddler 的加密数据后用会话密钥 B 解密得到请求数据,根据请求的数据返回响应,响应使用会话密钥 B 加密
    • 7. fiddler 收到响应后用会话密钥 B 解密在用会话密钥 A 加密转发给 chrome
  • 大致的流程图



Https 在建立 Socket 连接之前,需要进行 SSL/TSL 握手,这里的握手分为单向和双向,后面有缘再进行补充了
另外这里的 markdown 真的难用,上下文直接的分隔间距太短了,编排也贼难受

共收到 3 条回复 时间 点赞

新人写文章有点天赋的

难以怀瑾 回复

以后不写了,后面写考公的😁 😄

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册