在 Mac VPN 客户端里点击导出,得到的文件只是描述连接,本身并不是连接。服务器地址、端口、协议,往往还有证书,都在文件里。登录密码、私钥密码短语,以及授权这台 Mac 的注册信息,通常不在其中。所以配置文件可以顺利导入、出现在客户端列表里,却在第一次认证时失败;这个缺口来自格式本身,而不是下载损坏。

Part of the connectionWhere it lives on the old MacWhat an export does with it
Server, port, protocol, routesClient profile or managed settingsUsually included when the client exports configuration
Client certificate and private keyInside the package, the login keychain, or issued by MDMIncluded only if the format packs it; a keychain-held key stays behind
Login password, key passphraseLogin keychainLeft out by design
Device authorization or enrollmentServer side, bound to the certificate or the device recordNot transferable; the new device has to enroll

导出文件里实际有什么

导出是一个容器,文件扩展名说明的比内容少。OpenVPN 配置文件是文本:指令,外加可选的 <ca>、<cert> 和 <key> 内联块。Tunnelblick 的安装包是配置和设置的压缩归档。受管理的 .mobileconfig 是载荷的 plist。在导入任何内容之前,两份清单就能回答大部分问题。

对文本配置文件,数一数它携带的 PEM 块:grep -c "PRIVATE KEY" your-profile.ovpn。结果不为零,说明文件含密钥材料,从此必须当作密码处理。对归档,不展开就列出内容:tar -tf export.tbz,如果客户端生成了 zip,则用 unzip -l export.zip。该清单中的密钥文件、证书文件以及 up 或 down 脚本,是重新签发用户账号不会重建的部分。

反过来的情况同样重要。配置文件用文件名指向密钥而不是内嵌密钥时,导出是有意不完整的,缺的那一半必须来自签发方。如果证书颁发机构归你所有,把该文件一并复制没有问题;如果文件附带的是在老 Mac 上生成的、与设备绑定的证书,就不行。

为什么钥匙串那一半从不随文件走

macOS 把 VPN 密码和密钥密码短语放在登录钥匙串里,客户端也把它们存在那里,而不是自己的设置文件。Tunnelblick 在其导出与导入指南中说明了这一点:安装包携带配置和设置,省略钥匙串中保存的用户名、密码和密码短语。这种省略是有意为之。钥匙串条目按用户和机器分别保护,复制到目标机器的条目没有有效的访问控制,结果要么是无用的文件,要么是明文秘密。

在计划迁移之前,你可以确认凭据到底住在哪里。security find-internet-password -s vpn.example.com 会打印匹配条目的属性,没有匹配时以非零状态退出;同一条命令加上 -g 会要求显示密码,所以不带它的查询是更安全的检查。那里有命中,说明配置文件并没有携带密码,也无法强迫它携带。这也意味着新 Mac 上会再次询问密码,而旧 Mac 上的“始终允许”在那里毫无作用。

不过,并非每个秘密都是钥匙串条目。Tunnelblick 自己的软件包文档指出,包内可能包含密钥、证书和脚本文件。所以,导出不含钥匙串条目,与“导出可以安全地通过邮件发送”并不是同一回事;在列清里面有什么之前,请把归档当作敏感文件。

原生和受管理的 VPN 没有导出路径

通过系统设置配置的连接不提供受支持的导出。scutil --nc list 显示系统已知的服务,scutil --nc show "Work VPN" 打印某个服务的配置,足以读出它的服务器和协议。两者都不是迁移工具。保存在 /Library/Preferences/SystemConfiguration/preferences.plist 中的服务标识符是指向该文件的引用,所以复制文件并改写标识符不是受支持的迁移,还可能干扰目标机器上无关的网络服务。

受支持的路径是 Apple 文档写明的那条:安装管理员提供的 VPN 设置文件,或输入运营商给你的设置。连接受管理时,请索取新文件或新的注册,而不是照着旧对话框的截图重建。对 MDM 推送的配置,证书载荷可能承载身份,而私钥在设备上生成;这种情况下,即使旧配置复制得完美无缺,也无法让新 Mac 通过认证。

验证恢复结果,而不是相信列表

列表里的配置和真正可用的隧道是两种状态,只有一种值得报告。导入并连接之后,先确认隧道接口存在,再确认隧道在做什么。

ifconfig | grep -A3 utun 显示隧道接口及其地址。scutil --dns | grep nameserver 显示连接后哪些解析器处于活动状态,split-DNS 配置通常就在这里出现分歧。然后访问真正重要的资源:curl -sS -o /dev/null -w "%{http_code}" https://intranet.example.com。三项都通过,说明设置、DNS 和路由都到了;客户端里的绿色图标本身并不说明这些。

导入之后常出现两种失败,两者都被归咎于文件。公网名称能解析而内网名称不能,通常说明配置里的 DNS 服务器被丢掉了,或者 split-DNS 没有被保留。隧道能建立却不转发流量,通常说明路由或服务器端授权没有随配置生效。重新导入同一个归档会重现这两种情况。

在让旧 Mac 退役之前

删除导出文件并不等于吊销。如果旧设备用证书认证,服务器仍然信任那张证书,直到它被吊销或重新签发。如果它用共享账号认证,该账号上的会话可能仍然有效。趁硬件还在手边,先把服务器端的那一步做完。

当新配置包含密钥时,把它和其他凭据一起存放,并把密码输入客户端,让它进入新的钥匙串而不是留在文件里。最后一步检查:在旧 Mac 关机的情况下,从替换机器连接。只在源机器在线时才能工作的交接,从来都不算完整。

相关文章