描述文件会出现在“设置”里,带有名称、签名者和一个“安装”按钮,而签名者那一行是大多数人会读的部分。这一行只回答一个问题:按照签名验证规则,是谁打包了这些设置。它并不会说明 VPN 载荷指向的是你雇主的网关,也不会说明其中内嵌的根证书理应进入你的 TLS 信任存储。下面的逐步检查会按照设备实际应用的顺序打开这个包。

从信封开始:这个描述文件由谁签名

在 iOS 上,描述文件出现在“设置”>“通用”>“VPN 与设备管理”中,签名者显示在“安装”按钮上方。点击任何东西之前先读这个名字,并问一句:它是不是你预期会收到设置的那个组织。来自你不认识的一方的有效签名仍然是有效签名,而它授权的是对方的配置,不是你的配置。同一个屏幕还会告诉你这个描述文件到底有没有签名。

如果你在 Mac 上有这个文件,请在它到达手机之前先检查。security 工具会解码 CMS 信封,并打印设备将要读取的 plist,内容相同,只是没有挡在中间的“安装”按钮。Apple 的 配置强制执行 文档把签名描述为来源验证,而这正是这里所讨论的范围。

security cms -D -i corp-vpn.mobileconfig -o corp-vpn.plist
plutil -p corp-vpn.plist

如果签名者不是你所期待的一方,或者文件未签名且来自无法为其担保的渠道,请就此停下。本文后面的任何内容都无法让一个不受信任的信封变得可信。

逐一打开每个载荷,并说清它安装什么

描述文件是一个容器,真正值得看的是其中 PayloadContent 数组。每个条目带有一个 PayloadType,说明设备将安装什么:受管理的 VPN 配置、PKCS#12 身份、根证书,或管理注册。先打印这些类型,再去读任何设置。

plutil -extract PayloadContent xml1 -o - corp-vpn.plist |
  grep -E 'PayloadType|PayloadDisplayName'

VPN 载荷描述一条连接:服务器地址、认证方式,可能还有按应用或按需触发的规则。身份载荷提供该连接将要出示的客户端凭据。根证书载荷添加一个信任锚点,而管理载荷把持续控制权交给一台服务器。这是四种不同的承诺,而签名覆盖的是整个包,并不分别为每一项担保。请按这个顺序阅读,因为没有身份,VPN 就没有用;而不知道身份由谁签发,身份本身也说明不了什么。

文件上的密码保护又是另一回事。加密的包会对没有密码的人隐藏内容;它并不决定你是否应当授权其中的东西。把密码当作一种交付机制,而不是一次审查。

把证书追溯到使用它们的连接

列出包中的证书,并把每一张对应到一项职责。客户端证书向网关标识这台设备,签发它的 CA 属于该连接的信任链,而为代理或内部服务安装的根证书并不会自动成为每个 HTTPS 站点的锚点。在 iOS 上,手动安装的根证书在启用之前对 TLS 始终不受信任,你需要在“设置”>“关于本机”>“证书信任设置”中启用它;而通过管理下发的根证书无需这一步即可受信任。这一差别恰恰说明了载荷的用途为何重要。

openssl pkcs7 -inform DER -in corp-vpn.mobileconfig -print_certs -noout
security find-certificate -a -c "Corp Root" -p | openssl x509 -noout -subject -dates

为你承载流量的服务商并不会因此就成为你访问的每个网站的 TLS 端点。拦截既需要流量路径,也需要应用所接受的信任锚点,而一个只带一张证书的描述文件两者都证明不了。要问清楚哪条连接使用这张证书、哪些应用会接受它,而不是假定安装描述文件就能解密一切。

安装之后:验证,并了解移除会做什么

描述文件安装完成后,请从设备上确认,而不是看你下载的文件。设置屏幕会列出已安装的描述文件、它的签名者和载荷,VPN 屏幕则显示连接是否按预期配置。删除下载的文件什么也不会移除;已安装的配置是另一个独立对象。

profiles show -type configuration
scutil --nc list

如果描述文件包含管理注册,请在安装之前而不是之后阅读移除的后果。移除该注册会连同其关联配置一起移除,并且可能删除受管理的应用,具体取决于设备当初如何注册。当证书看起来不对时,这不是可以尝试的修复步骤。在移除任何东西之前,先问管理员是哪个载荷出了问题。

本文结束时应当得到四个各自独立的答案:谁签了这个包、它安装了哪些载荷、每条连接使用哪种身份与信任,以及移除会带走什么。把它们分开看待,已签名的描述文件就会变成一次经过审查的决定,而不是一个绿色的对勾。

相关文章