Charles Proxy HTTPS 抓包完全指南 – wiki基地


Charles Proxy HTTPS 抓包完全指南:揭秘加密流量

在现代网络世界中,HTTPS 已经成为主流。从简单的网页浏览到复杂的 API 调用,几乎所有敏感或重要的通信都使用 HTTPS 进行加密,以确保数据传输的安全性和隐私性。这无疑是一件好事,但对于需要调试、分析或理解应用程序和服务器之间通信的开发者、测试人员或安全研究人员来说,却带来了一个挑战:我们无法直接看到加密数据包的内容。

这时,像 Charles Proxy 这样的抓包工具就显得尤为重要。Charles Proxy 是一个跨平台的 HTTP 代理、HTTP 监视器和反向代理工具。它允许开发者查看所有进出计算机的 HTTP 和 HTTPS 流量。虽然抓取 HTTP 流量相对简单,但要抓取并解密 HTTPS 流量,则需要进行额外的配置。

本文将提供一份详细的 Charles Proxy HTTPS 抓包指南,带你一步步完成设置,并深入了解其工作原理和高级功能。

什么是 Charles Proxy?为何选择它进行 HTTPS 抓包?

Charles Proxy 是一个基于 Java 开发的图形界面抓包工具。与 Wireshark 等网络嗅探器不同,Charles 工作在应用层(OSI 第 7 层),作为客户端和服务器之间的代理。这意味着它能更方便地解析和显示 HTTP/HTTPS 协议的结构,如请求头、请求体、响应头、响应体、Cookie 等,而不是仅仅显示原始 TCP/IP 数据包。

选择 Charles Proxy 进行 HTTPS 抓包的主要原因包括:

  1. HTTPS 解密能力: 这是其核心功能,通过中间人攻击(MITM)技术,但这种攻击是在用户知情并主动安装信任证书的情况下进行的,是合法的调试手段。
  2. 友好的用户界面: 清晰地展示会话列表、请求/响应详情,支持多种视图(如 JSON、XML、Tree 等)。
  3. 强大的过滤功能: 可以轻松过滤出特定主机、路径或查询参数的请求。
  4. 丰富的高级工具: 支持修改请求/响应(Breakpoints, Rewrite)、模拟慢速网络(Throttling)、本地文件映射(Map Local)、远程地址映射(Map Remote)等,这些对于调试、测试和接口模拟非常有用。
  5. 跨平台支持: 支持 Windows、macOS 和 Linux,并且可以方便地配置抓取移动设备(iOS、Android)的流量。

HTTPS 抓包的工作原理:合法中间人攻击(MITM)

理解 Charles 如何抓取 HTTPS 的关键在于理解其“中间人攻击”的工作原理。正常的 HTTPS 连接流程大致如下:

  1. 客户端向服务器发起连接。
  2. 服务器返回其SSL证书。
  3. 客户端验证服务器证书(包括证书链、有效期、域名匹配等),确认服务器身份可信。
  4. 客户端和服务器协商加密算法,交换密钥。
  5. 使用协商好的密钥对后续通信进行加密和解密。

Charles Proxy 作为中间人时,流程变成了:

  1. 客户端向目标服务器发起连接请求(例如 https://www.example.com)。
  2. Charles 拦截到这个请求。
  3. Charles 冒充客户端向真正的目标服务器发起连接。
  4. 真正的服务器返回其证书给 Charles。
  5. Charles 解密来自服务器的响应,或者在建立连接时与服务器协商密钥。
  6. Charles 使用自己的伪造证书(该证书由 Charles 的 Root 证书签发,证书中的域名是目标服务器的域名)返回给真正的客户端
  7. 关键一步: 如果客户端信任 Charles 的 Root 证书(因为你手动安装并信任了它),客户端会认为这个伪造证书是有效的,并与 Charles 建立加密连接。
  8. Charles 解密来自客户端的请求。
  9. Charles 加密请求(使用与真正服务器协商的密钥),发送给真正的服务器。
  10. Charles 接收服务器的响应(已加密),解密
  11. Charles 加密响应(使用与客户端协商的密钥),发送给客户端。

通过这个过程,Charles 成功地站在了客户端和服务器之间,扮演着“翻译”的角色,能够看到并修改所有流经的明文数据。这个过程之所以可行,是因为我们在操作系统或设备上主动安装并信任了 Charles 的 Root 证书,使得客户端(浏览器、应用程序等)误认为 Charles 伪造的证书是合法的。

准备工作

在开始之前,请确保你已经完成以下准备:

  1. 下载并安装 Charles Proxy: 从 Charles 官网 (https://www.charlesproxy.com/download/) 下载适合你操作系统的版本并完成安装。Charles 是付费软件,但提供免费试用期,试用期内每次使用有时间限制,但功能完整。
  2. 了解你的网络环境: 你通常需要抓取的是本机或者同一局域网内其他设备的流量。Charles 默认监听本机作为代理。

核心步骤:配置 Charles 进行 HTTPS 抓包

抓取 HTTPS 流量需要两个核心步骤:

  1. 在 Charles 中开启 SSL Proxying: 告诉 Charles 你希望对哪些域名的 HTTPS 流量进行解密。
  2. 在需要抓包的设备/系统上安装并信任 Charles 的 Root 证书: 使得客户端信任 Charles 伪造的证书。

步骤 1:开启 Charles 的 SSL Proxying 功能

  1. 打开 Charles Proxy。
  2. 在菜单栏选择 Proxy -> SSL Proxying Settings...
  3. 在弹出的窗口中,勾选 Enable SSL Proxying
  4. 在下方的 Include 列表中,点击 Add 按钮。
  5. Host 字段输入你想要抓包的域名。例如,要抓取所有 GitHub 的 HTTPS 请求,输入 github.com。要抓取所有域名的 HTTPS 请求(通常用于调试未知应用),输入 *
  6. Port 字段通常可以留空或输入 443(HTTPS 默认端口)。输入 * 表示该主机上的所有端口。
  7. 点击 OK 保存设置。

最佳实践: 强烈建议只添加你需要抓包的特定域名,而不是使用 * 包含所有域名。这样可以减少 Charles 的处理负担,也避免抓取大量无关流量。同时,抓取所有流量可能包含一些敏感数据,按需开启更安全。

步骤 2:安装并信任 Charles 的 Root 证书

这一步是使客户端信任 Charles 伪造证书的关键。不同的操作系统和设备有不同的安装方法。

A. 在 Windows 上安装证书

  1. 在 Charles 菜单栏选择 Help -> SSL Proxying -> Install Charles Root Certificate
  2. Windows 会打开证书导入向导。选择 安装证书
  3. 选择 当前用户本地计算机(通常选择 当前用户)。点击 下一步
  4. 选择 将所有证书都放入下列存储。点击 浏览
  5. 选择 受信任的根证书颁发机构 (Trusted Root Certification Authorities)。点击 确定
  6. 点击 下一步,然后点击 完成
  7. 系统会弹出安全警告,询问你是否信任此证书。选择
  8. 导入成功后,重启你的浏览器或其他需要抓包的应用。

B. 在 macOS 上安装证书

  1. 在 Charles 菜单栏选择 Help -> SSL Proxying -> Install Charles Root Certificate
  2. macOS 会打开“钥匙串访问”应用,并定位到 Charles Proxy Custom Root Certificate。
  3. 双击该证书。
  4. 在弹出的证书详情窗口中,展开 信任 (Trust) 部分。
  5. 使用此证书时: (When using this certificate:) 的下拉菜单从 使用系统默认设置 (Use System Defaults) 修改为 始终信任 (Always Trust)。
  6. 关闭证书详情窗口,系统会提示你输入用户密码以保存更改。输入密码并点击 更新设置
  7. 在“钥匙串访问”中确认证书旁边显示蓝色加号,表示已完全信任。
  8. 重启你的浏览器或其他需要抓包的应用。

C. 在 iOS 设备上安装证书(物理设备)

抓取移动设备的流量是 Charles 的常见用途。你需要将手机的网络代理设置为 Charles 所在的电脑的 IP 地址和端口。

  1. 查找电脑的 IP 地址和 Charles 的端口:
    • 在 Charles 菜单栏选择 Help -> Local IP Address,记下你的电脑在局域网内的 IP 地址。
    • Charles 默认的代理端口是 8888。你可以在 Proxy -> Proxy Settings... 中查看和修改。
  2. 设置 iOS 设备的代理:
    • 确保你的 iOS 设备和运行 Charles 的电脑连接在同一个 Wi-Fi 网络下。
    • 在 iOS 设备上,进入 设置 -> 无线局联络网 (Wi-Fi)
    • 点击当前连接的 Wi-Fi 网络名称旁边的 i 图标。
    • 滚动到底部,找到 HTTP 代理。选择 手动
    • 服务器 字段输入你的电脑的 IP 地址。
    • 端口 字段输入 Charles 的端口(默认为 8888)。
    • 关闭设置。
  3. 在 iOS 设备上安装并信任 Charles 证书:
    • 使用 Safari 浏览器访问 chls.pro/ssl
    • Safari 会提示你下载一个配置描述文件。点击 允许
    • 下载完成后,进入 设置 -> 通用 -> VPN 与设备管理 (在 iOS 15+ 版本) 或 描述文件 (在旧版本)。
    • 找到刚刚下载的 Charles Proxy SSL Proxying Certificate 描述文件,点击 安装。输入你的设备密码。
    • 安装完成后,最关键的一步(iOS 10.3+ 需要):回到 设置 -> 通用 -> 关于本机 -> 证书信任设置
    • 找到 Charles Proxy Custom Root Certificate,将其旁边的开关打开,启用完全信任。
    • 系统会弹出警告,点击 继续
  4. 现在,在 iOS 设备上进行 HTTPS 请求(例如打开 Safari 访问一个 HTTPS 网站),你应该能在 Charles 中看到并解密这些请求了。

D. 在 Android 设备上安装证书(物理设备)

Android 设备设置代理与 iOS 类似,但证书安装和信任更为复杂,尤其是在 Android 7.0 及以上版本。

  1. 查找电脑的 IP 地址和 Charles 的端口: 同 iOS 步骤 1。
  2. 设置 Android 设备的代理:
    • 确保你的 Android 设备和运行 Charles 的电脑连接在同一个 Wi-Fi 网络下。
    • 在 Android 设备上,进入 设置 -> 网络和互联网 -> WLAN
    • 长按当前连接的 Wi-Fi 网络名称,选择 修改网络详情
    • 找到 代理 设置,选择 手动
    • 代理主机名 字段输入你的电脑的 IP 地址。
    • 代理端口 字段输入 Charles 的端口(默认为 8888)。
    • 点击 保存
  3. 在 Android 设备上安装 Charles 证书:
    • 使用浏览器访问 chls.pro/ssl
    • 设备会提示你下载证书文件(通常是 .pem.cer 格式)。下载它。
    • 下载完成后,进入 设置 -> 安全 -> 加密与凭据 -> 安装证书 -> WLAN 证书CA 证书(不同版本路径可能不同)。
    • 找到你刚刚下载的证书文件进行安装。
    • 系统会要求你设置屏幕锁定 PIN 或密码(如果之前没有设置)。
    • 输入证书名称(例如:Charles)。
    • 点击 确定

Android 7.0+ 的证书信任问题:

从 Android 7.0 (Nougat) 开始,应用程序默认不再信任用户安装的证书存储中的证书。这意味着即使你按照上述步骤安装了 Charles 证书,大多数应用(尤其是那些设置了 targetSdkVersion 24+ 的应用)仍然不会信任 Charles 伪造的证书,导致 HTTPS 连接失败或无法抓包。

解决方案(有限制):

  • 应用开发者配置: 应用程序的开发者需要在 network_security_config.xml 文件中明确配置,允许信任用户或系统安装的额外证书。如果应用没有这样做,你就无法抓取该应用的 HTTPS 流量(浏览器通常会信任用户安装的证书,所以浏览器访问的网站可以抓取)。
  • 使用旧版本 Android 设备: 在 Android 7.0 之前的版本上,用户安装的证书是全局信任的。
  • Root 设备并作为系统证书安装: 如果你的设备已 Root,可以将 Charles 证书移动到系统证书存储目录 (/system/etc/security/cacerts/)。这需要 Root 权限和文件管理器应用,风险较高,操作需谨慎。
  • 使用模拟器: Android 模拟器通常更容易进行抓包,有时可以绕过用户证书的限制,或者更容易 Root 并安装系统证书。

因此,在 Android 7+ 设备上抓取特定 App 的 HTTPS 流量可能会遇到困难,这不是 Charles 的问题,而是 Android 系统的安全限制。

E. 在 Firefox 浏览器中安装证书 (如果 Firefox 不使用系统证书存储)

有些应用程序或浏览器(如 Firefox)有自己的证书存储。如果 Firefox 不信任系统安装的 Charles 证书,你需要单独导入:

  1. 在 Charles 菜单栏选择 Help -> SSL Proxying -> Save Charles Root Certificate...,将证书保存到本地文件(例如 charles.cer)。
  2. 打开 Firefox。
  3. 进入 选项 (Preferences) -> 隐私与安全 (Privacy & Security)。
  4. 滚动到底部找到 证书 (Certificates) 部分,点击 查看证书... (View Certificates…)。
  5. 证书管理器 (Certificate Manager) 窗口中,切换到 证书机构 (Authorities) 标签页。
  6. 点击 导入... (Import…) 按钮。
  7. 选择你刚才保存的 charles.cer 文件。
  8. 在弹出的窗口中,勾选 信任此 CA 机构以识别网站。 (Trust this CA to identify websites.)。点击 确定
  9. 关闭所有设置窗口,重启 Firefox。

使用 Charles 进行抓包和分析

完成上述配置后,你就可以开始使用 Charles 进行抓包了。

  1. 启动抓包: 默认情况下,Charles 启动后会自动开始记录流量。你也可以点击主界面左上角的红色圆形按钮手动开始/停止记录。
  2. 进行网络操作: 在配置好的设备/系统上进行网络操作(访问网站、使用应用等)。
  3. 查看会话: Charles 主界面左侧会列出捕获到的会话列表,按请求的时间顺序排列。HTTPS 会话如果成功解密,会在图标旁显示一个“锁”形图标。
  4. 过滤会话:
    • 使用顶部的筛选框(放大镜图标)输入关键词(如域名、路径)快速过滤。
    • 更强大的过滤:选择 Proxy -> Recording Settings... -> IncludeExclude 标签页。在这里你可以设置只记录或排除特定主机、端口、协议甚至 URL 路径的请求。这对于集中分析目标流量非常有用。
  5. 分析请求和响应: 在左侧会话列表中选择一个会话,右侧面板会显示该会话的详细信息。常用的标签页包括:
    • Overview: 请求的基本信息,如 URL、状态码、请求方法、大小、时间等。
    • Headers: 查看请求头和响应头。
    • Request: 查看请求的原始数据、表单数据、JSON/XML 树等。
    • Response: 查看响应的原始数据、JSON/XML 树、图片预览、文本等。
    • Cookies: 查看请求和响应中的 Cookie 信息。
    • Contents: 综合视图,有时能更直观地展示内容。
    • Notes: 可以添加备注。

对于 JSON 和 XML 格式的数据,Charles 会自动将其格式化成树状结构,方便查看层级关系和内容,这比直接看原始文本方便得多。

Charles 的常用高级功能

除了基本的抓包和查看,Charles 还提供了许多强大的功能:

  1. Breakpoints(断点): 允许你在请求发出前或响应返回前中断通信,查看并修改请求或响应的内容,然后继续发送。

    • 设置方法:Proxy -> Breakpoint Settings...,添加需要设置断点的 Host 和 Path,选择是请求断点还是响应断点。或者在左侧会话列表右键点击某个会话,选择 Breakpoints
    • 使用场景:修改请求参数进行接口测试、修改响应数据模拟不同场景(如错误响应、空数据)。
  2. Rewrite(重写): 允许你根据规则自动修改请求或响应的特定部分(如修改 Header、Host、Path、URL 参数、Body 内容等)。

    • 设置方法:Tools -> Rewrite,勾选 Enable Rewrite,添加规则集和具体规则。
    • 使用场景:批量修改请求头、将 HTTP 强制重定向到 HTTPS、修改响应状态码、替换响应体中的特定文本。
  3. Map Local(本地映射): 将某个远程 URL 的响应映射到本地文件。

    • 设置方法:Tools -> Map Local,勾选 Enable Map Local,添加映射规则,指定远程 URL 和对应的本地文件路径。
    • 使用场景:在不修改前端代码的情况下,测试修改后的静态文件(HTML, CSS, JS)、模拟接口响应以便前端开发在接口未完成时进行调试。
  4. Map Remote(远程映射): 将某个 URL 的请求重定向到另一个远程 URL。

    • 设置方法:Tools -> Map Remote,勾选 Enable Map Remote,添加映射规则,指定原始 URL 和目标 URL。
    • 使用场景:将生产环境的某个接口请求重定向到测试环境、将旧版本的接口重定向到新版本。
  5. Throttling(限速): 模拟慢速网络环境,测试应用在不同网络条件下的表现。

    • 设置方法:Proxy -> Throttling Settings...,勾选 Enable Throttling,选择预设的网络类型或自定义带宽和延迟。
    • 使用场景:测试应用在 2G/3G 网络下的加载速度、错误处理和用户体验。
  6. DNS Spoofing(DNS 欺骗): 将特定域名的解析 IP 指向另一个 IP 地址。

    • 设置方法:Tools -> DNS Spoofing,勾选 Enable DNS Spoofing,添加域名和对应的 IP 地址。
    • 使用场景:将某个域名指向测试服务器的 IP 地址,方便测试。

常见问题与故障排除

在进行 HTTPS 抓包时,可能会遇到一些问题:

  1. 证书不受信任错误: 浏览器或应用提示证书存在问题、不安全、隐私错误等。

    • 原因: 没有正确安装或信任 Charles 的 Root 证书。
    • 解决方案: 仔细检查本文中关于证书安装的步骤,确保证书安装到了正确的证书存储区(如 Windows 的“受信任的根证书颁发机构”、macOS 的“始终信任”、iOS 的“证书信任设置”)。重启浏览器或应用后再次尝试。对于 Android 7+ 的 App,可能是应用本身不信任用户证书。
  2. Charles 中看不到任何流量:

    • 原因: 设备/系统没有正确配置代理;Charles 的代理端口被防火墙阻止;Charles 没有启动或监听正确的接口。
    • 解决方案:
      • 检查设备/系统的代理设置是否指向 Charles 所在的电脑 IP 和端口。
      • 检查 Charles 的代理设置(Proxy -> Proxy Settings...)是否启用了 HTTP Proxying,以及监听的端口是否正确。
      • 检查电脑或设备的防火墙设置,确保允许 Charles 监听的端口(默认为 8888)的流量通过。
      • 确保 Charles 正在运行,并且红色圆形按钮表示正在记录。
  3. 可以看到 HTTPS 请求,但内容显示 <unencrypted> 或乱码:

    • 原因: 没有为该域名开启 SSL Proxying;证书没有安装或信任成功。
    • 解决方案:
      • 检查 Proxy -> SSL Proxying Settings... 中是否添加了该域名,并且勾选了 Enable SSL Proxying
      • 再次检查证书是否正确安装和信任。
  4. 应用程序(特别是移动 App)在抓包时无法正常工作,提示网络错误:

    • 原因: 最常见的是 Android 7+ 的证书 Pinning 或不信任用户证书问题。也可能是应用检测到代理或证书异常而主动断开连接。
    • 解决方案: 参考前文 Android 7+ 的证书信任问题部分。对于证书 Pinning 严格的应用,可能需要使用更高级的技术(如 Root、Xposed 框架、或者特定的抓包绕过工具),这超出了本文的范围。
  5. Charles 提示端口被占用:

    • 原因: Charles 默认端口(8888)被其他应用占用。
    • 解决方案:Proxy -> Proxy Settings... 中将 Charles 的端口修改为其他未被占用的端口(例如 8889),并更新设备/系统的代理设置。

安全与伦理提示

  • 仅在授权情况下使用: 抓取和分析网络流量可能涉及隐私和安全问题。请仅在你拥有权限的系统、设备和应用程序上进行抓包,或者在获得明确授权的情况下进行。
  • 注意敏感信息: 抓包过程中可能会捕获到用户名、密码、API 密钥等敏感信息。处理这些数据时务必小心,避免泄露。
  • 完成后移除证书/代理: 调试完成后,建议从操作系统或设备中移除 Charles 的 Root 证书,并将设备的代理设置恢复为正常状态。安装了额外的根证书会增加一定的安全风险(尽管 Charles 本身是合法的工具,但多一个受信任的证书就多一个潜在的攻击面)。

总结

Charles Proxy 是一个功能强大的网络调试利器,尤其在处理 HTTPS 流量时展现出其独特的优势。通过本文详细的步骤和说明,你应该已经掌握了如何配置 Charles 开启 SSL Proxying,如何在不同平台安装和信任 Charles 的 Root 证书,并了解了其基本使用方法和一些高级功能。

虽然 Android 7+ 引入了新的安全挑战,但对于大多数 Web 开发、API 调试以及在可控环境下的移动应用测试,Charles Proxy 仍然是不可或缺的工具。熟练掌握 Charles 的使用,将极大地提高你解决网络相关问题的效率。

希望这篇完全指南对你有所帮助!现在,开始你的 HTTPS 抓包之旅吧!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部