iOS Shadowrocket MITM 证书安装与 HTTPS 解密配置(2026)
Shadowrocket 开启 MITM 后,Rewrite 重写和广告过滤脚本才能拦截 HTTPS 流量;未安装并信任 CA 证书时大部分广告域名走 HTTPS 直接被放行。本文给出 CA 生成 → 描述文件安装 → 系统信任 → 验证四个阶段的完整 UI 路径,以及证书不信任、SSL Pinning 冲突和 Rewrite 规则类型的排查方法。
Shadowrocket 的 HTTPS 解密功能解决的是一个具体问题:你导入了订阅、配好了规则,但 Safari 里的广告还是照常显示。因为大部分广告域名走 HTTPS,未开启 MITM 时 Shadowrocket 只能看到加密后的密文,根本没机会执行 Rewrite 拦截。
开启 MITM 之后效果立即可见——广告请求被 reject 标记拒绝,页面清爽很多。但流程也最容易在「证书信任」这一步卡住:描述文件装了,回到 Shadowrocket 还是显示未信任。
这篇文章只写 MITM 证书安装和 Rewrite 去广告这两件事,不展开规则集和代理协议选择。操作对象是 Shadowrocket iOS 版(App Store 下载,$2.99 买断),iOS 版本要求 14+。
为什么装了配置文件、开了规则,广告还是原样出来?
Shadowrocket 的 Rewrite 规则本质是在网络请求经过代理时对 URL 做匹配。但 HTTP 明文请求在所有流量里的占比越来越小——Google 透明度报告显示 2026 年 Chrome 加载的页面中 95% 以上使用 HTTPS。没有 MITM,Shadowrocket 看到的 HTTPS 请求是:
TLS 握手 → 加密数据流(Shadowrocket 读不到 Host、Path、Query)
开启 MITM 后变成:
客户端 → Shadowrocket(解密 + 匹配规则 + 重新加密) → 目标服务器
Rewrite 规则只有在中间这一步(解密后)才能拿到明文 URL 做匹配。规则写得再多,不装证书不解密,等于没有。
但同时也意味着 Shadowrocket 角色等同于一个本地 CA 签发者——它用自己的证书替换了谷歌、苹果、银行的原始证书。所以必须在 iOS 系统层面告诉设备「这个 CA 我信任」,否则系统会拦截所有被代理的 HTTPS 连接。
证书安装的完整四个阶段,哪步漏了都会失败
流程有四个阶段,每个阶段走错一步都有对应的错误表现。先看清总览再动手:
| 阶段 | 在哪里操作 | 完成后应该看到什么 | 最常见的错误 |
|---|---|---|---|
| 生成 CA 证书 | Shadowrocket → 配置 → 点配置文件 ⓘ → HTTPS 解密 → 生成新的 CA 证书 | 「生成新的 CA 证书」按钮变为「安装证书」 | 在错误的配置文件上操作(主界面选了配置 A,却在配置 B 里改) |
| 安装描述文件 | iOS 设置 → 通用 → VPN 与设备管理 → 找到 Shadowrocket CA → 安装 | 描述文件状态为「已验证」 | 点了 Safari 下载提示后没有去设置里继续安装,以为下载就等于装好了 |
| 系统信任证书 | iOS 设置 → 通用 → 关于本机 → 证书信任设置 → 打开开关 | 开关变绿,弹窗确认后继续 | 完全跳过这一步——描述文件安装 ≠ 系统信任,iOS 把两者分开处理 |
| 验证生效 | 打开 Safari 访问 https://google.com | 页面正常加载,地址栏锁标正常,Shadowrocket 日志有解密记录 | 看到广告还在就以为没成功,实际是没配 Rewrite 规则或没加 hostname |
阶段一:生成 CA 证书
Shadowrocket 底部「配置」页面显示你在用的配置文件列表。左侧有蓝色勾的是当前激活的配置。点它右侧的 ⓘ 进入编辑,往下翻到「HTTPS 解密」区域。打开开关,点「生成新的 CA 证书」。这一步完全在本地完成,不联网。
如果你同时在用多个配置(比如一套日常用、一套出国用),每个配置需要单独生成和安装证书。不过 iOS 系统里装的是同一个 CA——你只需要在任意一个配置里安装过一次,其他配置的 MITM 开关打开后会复用同一个证书。
阶段二:安装描述文件
点「安装证书」后 Safari 会弹出一个下载提示。点「允许」。之后必须切到 iOS 设置里继续。有一个常见中断:Safari 下载了 .mobileconfig 文件但没有自动打开。如果你看到下载提示后点了「关闭」或者被其他通知打断了,去 Safari 的下载管理器(地址栏左侧的下载图标)点那个 .mobileconfig 文件手动打开。
描述文件内容只包含证书公钥,不含私钥。私钥始终留在 Shadowrocket 的钥匙串里,不会以任何形式导出。
阶段三:系统信任——卡住最多人的一步
描述文件安装完成不等于 iOS 信任这个证书。iOS 的安全模型把「安装」和「信任」分成两个独立操作:
- 安装:把证书放进系统的证书存储区
- 信任:在「关于本机 → 证书信任设置」里逐一手动授权
设计意图是:即使一个描述文件被恶意安装(比如通过 MDM 推送),只要用户不去「证书信任设置」里开开关,证书仍然无法拦截 HTTPS 流量。
进入「设置 → 通用 → 关于本机」,滑到最底部,如果看不到「证书信任设置」这一行,说明描述文件没有安装成功——回去检查「VPN 与设备管理」里是否有 Shadowrocket CA 条目。
点进去后列表里可能不止一个证书。找到 Shadowrocket CA(如果你生成时自定义了名称,按自定义名称找),开开关。此时 iOS 弹出警告:「开启此证书的完全信任将允许任何应用、Safari、邮件使用此证书建立的 TLS 连接,可能导致你的数据被第三方查看。」这是 iOS 对所有自签根证书的标准警告,不是 Shadowrocket 独有的。点「继续」。
安装完描述文件、也在关于本机里开了信任,为什么少数 App 还是连不上?
这个问题和 Shadowrocket 无关,和 App 自身的安全策略有关。
部分 App(银行、支付、社交、游戏)启用了 SSL Pinning(证书锁定):App 在代码层面硬编码了它信任的服务器证书或公钥,不接受任何系统级别的 CA 代签。当 Shadowrocket 用自己的证书替换了服务器证书时,App 检测到证书链不匹配,直接拒绝握手。
表现可能是:App 打开后无法登录、加载转圈、闪退,或者直接弹「网络连接失败」。不同 App 的降级策略不同。
处理方式不是解决这个冲突,而是避开它:
# 在配置的 Rules 里,对已知启用 SSL Pinning 的域名设为 DIRECT
DOMAIN-SUFFIX,icbc.com.cn,DIRECT
DOMAIN-SUFFIX,alipay.com,DIRECT
DOMAIN-SUFFIX,paypal.com,DIRECT
这些域名走 DIRECT 直连,不经过代理,也不经过 MITM 解密。同时确认 MITM hostname 列表里没有包含这些域名的 SUFFIX 模式。
无法列出一个完整的 SSL Pinning App 清单,因为 App 随时更新加锁。原则上:银行、支付、加密货币交易、医疗健康类 App 一律不要写进 MITM hostname。你想拦截广告的只是新闻、工具、视频类 App 的 SDK 广告域名,不需要解密所有流量。
Rewrite 规则的四种操作类型怎么套到去广告场景里?
Shadowrocket 的 URL Rewrite 规则对匹配到的请求有四种处理方式。选错了不耽误连接,但广告可能去不干净。
| 操作类型 | 含义 | 适合拦截什么 | 不适合拦截什么 |
|---|---|---|---|
reject | 直接丢弃请求 | 统计 SDK、上报类(comScore、Flurry)——被丢弃后服务端收不到数据,客户端不显示任何东西 | API 类广告请求——请求被丢弃后 App 可能一直重试导致发热 |
reject-200 | 返回空内容,HTTP 200 | 开屏广告 API、信息流广告接口——App 收到 200 以为广告已回传但内容为空,不重试 | 图片资源——返回空文本内容可能让页面出现空白框 |
reject-img | 返回 1x1 透明 PNG | Banner 广告图、视频前贴片、插屏图片资源 | 非图片类请求——App 收到图片响应但期望 JSON,可能解析报错 |
302 | 重定向到指定 URL | 追踪参数清洗(utm_* 参数去除)、资源替换 | 直接拦截广告——不是移除而是换源,需要目标 URL 可用 |
一段实际可用的规则示例:
[URL Rewrite]
# 信息流广告 API 请求——返回空内容,App 不重试
^https?://api\.example\.com/v\d/ad/feed - reject-200
# 统计 SDK 上报——直接丢弃,后台收不到
^https?://.*\.doubleclick\.net/.* - reject
# Banner 图片广告——返回透明像素,不破坏页面布局
^https?://.*\.example-ad-cdn\.com/.*\.(jpg|png|gif) - reject-img
如果你不确定先选哪个,reject-200 是最稳的默认选择。等确定某个域名是纯图片或纯上报之后,再调整为 reject-img 或 reject。
证书过期后整个手机的网络会断吗?
MITM 证书有效期只有一年,过期之后如果你还开着 HTTPS 解密,流量会被阻塞——但不是手机断网,而是所有经过 MITM 的 HTTPS 连接因为证书不被信任而报 SSL 错误。
表现是:Safari 打开任何 HTTPS 网站都显示「此连接非私人连接」红色警告,点了「继续访问」才能进去;App 的网络请求直接超时。关闭 Shadowrocket 的 HTTPS 解密开关或者关掉代理,网络恢复正常。
证书过期之前不会有 iOS 系统提醒。建议在生成证书后在日历 App 里设一个 10 个月后的提醒,标题写下「Shadowrocket 重装 CA 证书」。操作路径就是重新走一遍本文的四阶段流程——生成新证书、安装描述文件、信任、验证。
删除旧证书再生成新的,比「续期」更干净。因为 iOS 不能给已安装的根证书直接续期,续期等于覆盖安装一个新的,但在「VPN 与设备管理」和「证书信任设置」里可能同时残留两个版本,造成信任链混乱。
如果你从社区导入了规则模块(如 deezertidal/shadowrocket-rules 提供的 .sgmodule 文件),模块里声明的 MITM hostname 用的是 %APPEND% 指令,不会因为你自己的证书操作而丢失。证书只是加解密层,hostname 是配置层,两者独立。
规则的维护比证书更频繁——App 更新后广告域名可能变化,规则可能会过期。一个可靠的订阅方式是用 配套订阅线路来保证订阅和节点更新正常,再通过规则模块更新 Rewrite 规则,两件事分开维护互不干扰。
相关阅读
来源与时间
本文最后查看时间:2026-05-29。操作路径会随客户端版本变化,遇到按钮名称不一致时,优先按同义菜单和官方文档查看。