装个描述文件就能防掉签?iOS 反撤销 DNS 到底是怎么回事

玩侧载的人大概都遇到过这一幕:应用装上去用得好好的,某天点开图标,iOS 弹出一句「不受信任的开发者」或者「无法验证 App」。原因通常是签名证书被苹果撤销了。

为了对付这件事,侧载社区里流行起一种东西——反撤销 DNS 配置文件。装一次,据说就能让已经签好的应用一直活着。这个说法有一半对、一半是误解。下面把它的原理和边界讲清楚。

它到底做了什么

反撤销配置文件的本质是一个 iOS 描述文件(mobileconfig),里面用的是苹果的「受管加密 DNS」功能。它的作用范围非常具体:只把特定域名的 DNS 查询,导向一个指定的加密 DNS 服务器,而不是接管你全部网络流量。

走的是 DNS over HTTPS(DoH)。文件里写的服务器地址是一个 Cloudflare Gateway 的 DNS 端点。注意关键的一点:具体要拦截哪些域名,并不写在这个描述文件里,而是由那个 Cloudflare 账户的服务端策略控制。也就是说,你装进手机的这个文件,只是把查询「转交给某台服务器」,真正的黑名单不在你手里,随时可以被对方改动。

描述文件里到底有什么

把文件拆开看,功能性 payload 只有两个:

  • com.apple.dnsSettings.managed —— 受管加密 DNS 配置,负责把指定域名导向 DoH 服务器
  • 一个可移除的 Web Clip —— 往主屏加一个快捷方式图标

重要的是它不含什么:没有 MDM 注册 payload、没有根 CA 证书、没有 VPN 配置、没有全局 HTTP 代理、也没有限制移除的设定。

文件本身带 CMS/PKCS#7 签名,签名身份是一个企业开发者证书,证书链基于苹果的 WWDR G3 层级,有效期一年。换句话说,这个描述文件自己也有到期日

它屏蔽了哪些苹果域名

这是全文最实用的部分。这份配置屏蔽的域名包括:

  • ocsp.apple.com —— 证书在线状态检查
  • ocsp2.apple.com —— 同上,较新的 HTTPS 端点
  • crl.apple.com —— 证书撤销列表
  • certs.apple.com —— 证书链与验证服务
  • valid.apple.com —— 证书验证
  • mesu.apple.com —— 系统软件更新目录
  • gdmf.apple.com —— 软件更新可用性检查
  • appattest.apple.com —— App 验证与设备证明
  • vpp.itunes.apple.com —— 受管 App 许可服务
  • 若干 Siri 相关主机名

看这份名单就能明白:它不是单纯的「证书撤销拦截器」,而是顺带干扰了系统更新、App Attest、受管应用等一整套基础设施。

有一点值得注意:它没有屏蔽 ppq.apple.com(苹果定义的企业 App 验证服务)。2021 年 6 月之后注册的开发团队,其开发签名/Ad Hoc 签名的应用首次启动必须联网过一遍 PPQ 检查。如果不屏蔽它,应用的首次验证不会被破坏——这其实是这份配置相对克制的地方。社区里更常见的做法是:安装和首次验证时临时放行 PPQ,之后再屏蔽。

原理:为什么屏蔽 DNS 就能延缓撤销

先从签名机制说起。非 App Store 安装的应用包含两部分东西:代码签名嵌入式描述文件。当苹果撤销某个签名证书时,证书本身并没有从你的应用里消失,它物理上还在。

真正发生的是:系统去问苹果「这张证书还有效吗」,苹果回答「已撤销」。如果设备因为 DNS 解析不到、或者连不上证书验证基础设施,就可能拿不到最新的撤销信息,从而延迟甚至阻止在线撤销检查。

这就是 OCSP、CRL、certs 这几个域名反复出现在反撤销配置里的原因——苹果自己就把它们归类为证书验证基础设施。

安装步骤

把配置装进 iPhone 或 iPad 的流程如下:

  • Safari 打开描述文件下载链接(其他浏览器不行,iOS 只认 Safari 的下载行为)
  • 下载完成后,系统会提示「已下载描述文件」
  • 打开设置,在顶部找到「已下载描述文件」并进入
  • 安装前先审查内容——这一步别跳过,确认看到的是加密 DNS 配置和 Web Clip,没有任何 MDM 或根证书
  • 点击「安装」,输入设备密码
  • 仔细读一遍警告内容,确认后完成安装

安装后可以到「设置」→「通用」→「VPN 与设备管理」里查看是否生效。

有一点要提醒:描述文件下载后 8 分钟内没有安装会被自动删除,所以下完就顺手装掉。另外,如果开启了失窃设备保护(Stolen Device Protection),在离开熟悉地点时可能会阻止安装,需要临时关闭。

移除方法很简单:「设置」→「通用」→「VPN 与设备管理」→ 选中该描述文件 → 移除。

它做不到的事

这部分是最需要讲清楚的,因为误解基本都出在这里。

  • 不能让证书永久有效:DNS 拦截只能干扰在线验证,无法改写描述文件里编码的过期日期。个人开发团队的 7 天有效期,照样会到期。
  • 不能把已撤销的应用救回来:正确用法是预防性的——在设备收到撤销结果之前就装好过滤。如果 iOS 已经知道证书被撤销了,事后装这个描述文件不保证能逆转。
  • 过期和撤销是两件事:过期是指超过了编码的有效期(DNS 无法推迟);撤销是指有效期内被签发方主动作废(DNS 可以干扰信息获取)。搞清楚区别,就不会对它抱错期待。
  • 不能给设备加 UDID:如果描述文件里压根没有你的设备 UDID,DNS 也没法帮你加进去。
  • 不能修复被改动的可执行文件:签名对不上,DNS 管不着。
  • 苹果随时可以改规则:引入新主机名、改变验证协议、改变缓存行为、或要求通过其他服务在线验证——这些都是苹果能做的事。

已知的副作用

屏蔽名单里那些域名会带来实际影响,值得提前知道:

  • 系统更新mesu.apple.comgdmf.apple.com 被路由,可能影响 OTA 更新的发现和下载。想升级系统时,可能得先移除描述文件。
  • App Attest:部分应用依赖这个服务做安全判断,屏蔽后可能影响这些应用的行为。
  • Siri:名单里包含 Siri 相关主机名,可能导致相关功能异常。
  • 隐私:DNS 查询实质上是交给了 Cloudflare Gateway 的运营方,对方理论上有能力观测和过滤你发往该解析器的查询。

还有一个小坑:这份描述文件的外层描述写着「包含 google 和 cloudflare DNS」,但实际 payload 里只有 Cloudflare Gateway 的 DoH,并没有 Google DNS。描述文字和实际内容不一致,这也说明为什么安装前必须审查 payload。

一个重要的兼容性提醒

苹果已经把 com.apple.dnsSettings.managed 标记为从 iOS 27 起弃用,替代方案是新的声明式配置 com.apple.configuration.network.dns-settings。如果你要长期使用这类配置,得留意它在新系统上的兼容性——旧 payload 在后续版本里可能失效。

顺手把几个容易混的概念讲清

  • P12 证书:一个 PKCS#12 归档,里面装着签名证书和对应的私钥。私钥才是真正用来签名软件的东西。只下载 .cer 是不够的,因为缺私钥。要把 P12 当密码一样保管。
  • P12 和描述文件是两回事:P12 是签名身份,.mobileprovision 是配置授权。侧载通常两个都要。
  • 签名不等于安全:签名能证明文件完整性和签名者身份,但恶意描述文件同样可以签名。所以安装界面上出现的 payload 类型要看清——看到 MDM、根证书、VPN、代理这些,就该停手。

几个常见报错怎么理解

  • 「不受信任的企业开发者」:手动安装企业应用时的正常提示。iOS 18 之后要到「设置」→「通用」→「VPN 与设备管理」里选中开发者,点「允许并重新启动」。
  • 「未验证」:无法完成在线验证。需要联网并保证 ppq.apple.com 可达,然后点「验证 App」。
  • 「无法验证 App」:通用错误。可能原因包括证书被撤销、描述文件过期、设备未注册、签名无效、权限不匹配、验证连接被阻断等。DNS 只能解决其中一部分,别指望它包治百病。

结论

反撤销 DNS 是一个基于「当前验证流量走哪些域名」这一假设的 DNS 过滤手段。它在特定条件下确实有用,尤其是在设备还没收到撤销信息之前就装好的情况下。

但它不是「苹果再也撤销不了你的应用」的保证。用正确的期待去用它——把它当成侧载工具箱里的一件工具,而不是护身符。最重要的一条仍然是:在日常使用的手机上安装任何配置描述文件之前,先看清楚它的内容