升级 iOS 后去开屏广告的插件不灵了?先分清是证书、插件还是 App 自己的问题

目录
  1. 先用一个现象判断方向
  2. 一、证书问题:装了不等于信任
  3. 升级系统真的会让信任失效吗?
  4. 二、证书没问题,但开屏还是去不掉
  5. 三、一个很多人没注意到的安全问题
  6. 按顺序查一遍

最近经常看到这样的提问:“插件去广告怎么去不了开屏了,是还在等更新吗?”同时也有人说刚升级完系统,MitM 就不工作了。

两种说法都有可能对,但它们是完全不同的故障。插件过期,你什么都不用做,等作者更新就行;证书出了问题,等多久都不会好。所以先别急着卸载重装,花五分钟把问题归到下面某一类里。

本文以 Loon、Surge、Shadowrocket 为例,这几个客户端的区别和价格可以看《Clash 电脑版、安卓版去哪下,选哪个?》里的 iPhone 部分。

先用一个现象判断方向

打开去广告插件依赖的那个 App,看两件事:

  • 这个 App 里所有去广告效果都没了,还是只有开屏没了、信息流广告照样被去掉?
  • 同一台手机上,别的 App 的去广告是不是也一起失效了?

如果是“全军覆没”,好几个 App 一起失效,大概率是证书或 MitM 总开关的问题,往下看第一部分。如果只是某一个 App、甚至只是开屏这一个位置不灵,证书多半没事,直接跳到第二部分。

一、证书问题:装了不等于信任

去开屏广告这类插件,大多要先解密 HTTPS 才能改写 App 拿到的广告数据,客户端里叫 MitM 或者“HTTPS 解密”。解密要用到客户端自己生成的一张根证书,而 iOS 把这件事拆成了两步:

  1. 安装描述文件:设置 → 已下载描述文件 → 安装,输锁屏密码;
  2. 信任这张根证书:设置 → 通用 → 关于本机 → 拉到最底下的“证书信任设置”→ 在“针对根证书启用完全信任”下面,把对应证书的开关打开。

苹果在支持文档里写得很直白:从网页或邮件手动装的证书,不会自动获得 SSL 信任,必须手动去开。很多人只做了第一步,看到“已安装”就以为完事了。

几个具体的判断点:

  • 关于本机里找不到“证书信任设置”:苹果的说法是,只有装了额外证书这一项才会出现。找不到,说明描述文件压根没装上,回到“通用 → VPN 与设备管理”看看有没有那张描述文件。
  • 开关是开的,但还是不生效:最常见的原因是“两张证书”。客户端配置里存着一张证书,系统里信任的是另一张。

第二种情况在 Loon 里很好查。Loon 生成的证书名字后面带一串数字,你打开 Loon 的证书管理记下这串数字,再去系统的“证书信任设置”里看被信任的是哪一串。社区教程里给的处理办法是:

  • 数字一样,但 Loon 显示“已安装,但未被系统信任”,去系统里把开关打开就行;
  • 数字不一样,就到“通用 → VPN 与设备管理”把旧的描述文件移除,回 Loon 重新生成证书、安装、信任,三步走一遍。

为什么会出现两张证书?最常见的是换配置。不少人隔段时间就导入一份新的完整配置,导入时如果没选“替换并保留节点和证书”,新配置里要么没有证书,要么带着作者的证书,系统里信任的那张就对不上了。Loon 社区 Wiki 专门提醒过导入时要点这一项。

Shadowrocket 也有类似的坑:HTTPS 解密是跟着配置走的。你切到另一份配置,那份配置的解密开关开没开、用的是哪张证书,都要单独再看一遍。iFansClub 的 Shadowrocket 教程把这个讲成“安装、信任、启用是三件事”,说得很准:证书在系统里出现了,不等于被信任;系统信任了,也不等于你当前这份配置打开了解密。

Surge 这边要注意的是,模块改不了 MITM 的 CA 证书,官方手册写明模块的 MITM 段只能动 hostname 和 skip-server-cert-verify。所以在 Surge 里,证书必须放在主配置里,靠订阅模块是装不上证书的。

升级系统真的会让信任失效吗?

目前没有找到苹果说过“系统更新会重置证书信任”。有人升级后失效,可能是升级前后刚好换过配置、恢复过备份,也可能是别的原因。建议不纠结这个,按上面的顺序查一遍,证书没问题就往下看。

二、证书没问题,但开屏还是去不掉

这一类反而更常见。几个原因按出现频率排:

1. 插件没跟上 App 更新。 开屏广告的接口地址、返回的数据格式,App 一更新就可能变。插件是按旧接口写的,自然就漏了。判断办法:看看插件的更新时间,再看目标 App 最近是不是刚更新过。如果 App 刚更新、插件好几周没动,大概率就是这个原因,开头那句“是还在等更新吗”其实问到点子上了。这时候能做的就是等,或者换一个更新更勤的插件。别同时开好几个作用于同一个 App 的插件,规则互相覆盖,反而更难查。

2. 开屏广告被缓存了。 很多 App 会提前把下一次的开屏素材下载好存在本地。你今天装好插件,明天打开看到的可能还是之前缓存下来的那张。先从后台彻底划掉 App 再打开,多试两三次再下结论。iOS 没有统一的“清除某个 App 缓存”按钮,App 自己设置里有清缓存就用它,没有的话只能卸载重装。

3. 广告请求走了 QUIC(HTTP/3)。 QUIC 跑在 UDP 上,MitM 解不了。客户端的做法是把命中解密列表的 QUIC 连接拦下来,逼 App 回落到普通 HTTPS。Surge 里这个行为叫 auto-quic-block,iOS 5.8.0 起默认开启;Loon 里对应的是 MitM 设置里的“QUIC 回退保护”,很多推荐配置会让你手动打开它和“MitM over HTTP/2”。如果你用的是精简配置、这两个开关从没碰过,去看一眼。

4. 解密列表里根本没有那个域名。 MitM 只解密 hostname 里列出的域名。Surge 手册里有两个细节容易忽略:不写端口的条目只对 443 端口生效;排除项(前面带 -)要写在最前面,因为是按顺序匹配、匹配上就停。所以如果你在 hostname 开头写了一条范围很大的排除项,后面插件追加的域名可能全被它吃掉。Shadowrocket 的模块要用 hostname = %APPEND% 域名 的写法追加,漏了 %APPEND% 会把你原来的列表整个覆盖掉。

5. App 做了证书锁定(SSL Pinning)。 有些 App 只认自己预设的证书,看到客户端替换过的证书就直接断开,这类 App 用 MitM 本来就去不掉广告,甚至会因为解密而打不开、登不上。Surge 的日志里有个提示可以帮你判断:如果某个主机 TLS 握手完成了,但客户端一个请求都没发就断开,Surge 会提示它很可能做了证书锁定。遇到这种情况,正确做法是把这个域名从解密列表里删掉,而不是想办法硬解。

三、一个很多人没注意到的安全问题

网上流传的不少“一键配置”里,[MITM] 或 [Mitm] 段直接带着 ca-p12 和 ca-passphrase。这两行就是一张根证书和它的私钥。

你导入了别人的配置、又在系统里信任了这张证书,等于信任了一张私钥已经公开的根证书。理论上,任何拿到这份配置的人,都能用同一张证书伪造出你手机会认的 HTTPS 证书。只要你信任着它,它就不只对你的客户端有效。

所以建议这样处理:

  • 导入别人的配置后,在客户端里自己重新生成一张证书,把配置里自带的那张替换掉,再安装、信任;
  • 系统“证书信任设置”里如果有好几张来历不明的旧证书,确认没用了就关掉信任,再到“VPN 与设备管理”里移除;
  • 解密列表只放插件需要的域名,银行、支付、证券类 App 的域名不要放进去。Surge 手册里那种“除苹果、iCloud 外全部解密”的写法是示范语法,日常用不建议照抄。

不再用去广告插件的时候,记得把 MitM 关掉,证书信任也一并关了。

按顺序查一遍

  1. 好几个 App 一起失效?去“证书信任设置”确认开关打开,再核对客户端里的证书和系统里信任的是不是同一张(Loon 看数字)。
  2. 最近换过配置?检查新配置里证书还在不在、HTTPS 解密开关开没开。
  3. 只有某个 App 不行?看插件更新时间和 App 更新时间,彻底关掉 App 重开两三次。
  4. 看 QUIC 回退保护 / auto-quic-block 有没有开。
  5. 查客户端日志:目标域名有没有被解密;如果握手后马上断开,多半是证书锁定,别硬解。

大部分情况查到第三步就有答案了。剩下的,就是等插件作者更新。