从 Android 导出 VPN 配置看起来像一次备份,而提供这个选项的菜单也没有纠正这种印象。你实际带走的,是一段解析器输入、一把系统可能永远交不回来的密钥,以及一份只签发给这台手机的授权。把这三样分开看,真正有用的问题就出现了:新设备上还缺哪一块?

文件是容易的部分。另外两样才决定迁移能否成功。

导出的配置里到底有什么

在信任它之前,先用文本编辑器打开文件。OpenVPN 配置是一门很小的配置语言:remote、proto、data-ciphers,还常常包含内嵌的 <ca>、<cert>、<key> 或 <tls-crypt> 块,由客户端交给自己的 TLS 栈。WireGuard 配置更扁平:[Interface] 里放 PrivateKey 和 Address,然后每个端点一个 [Peer],携带 PublicKey、AllowedIPs 和 Endpoint。IKEv2 则以 .mobileconfig 的形式出现,里面是载荷字典而不是密钥块。

这些文本本身都不是凭据。凭据是私钥,而每种格式要么把它直接贴在里面,要么指向一个只在创建它的客户端内部才能解析的别名。

密钥在 Android 上究竟住在哪里

Android 把应用数据放在 /data/data/<package> 下,只有该应用的 UID 能读取。未 root 的手机上没有受支持的办法复制另一个应用的私有目录,而 adb backup 在 Android 12 将其废弃、客户端开始声明 allowBackup="false" 之后,也不再是通用答案。因此从 Android 客户端导出,意味着那个客户端实现了什么,而不是文件系统的副本。

身份层位于应用之下。如果客户端把你的密钥导入 Android Keystore,材料就在那里生成或封装,之后的导出可能携带对 Keystore 别名的引用,而不是字节本身。硬件支持的密钥被设计成连所属应用都读不出来,Keystore documentation 对此有说明,所以指向该别名的配置在同一台手机上能干净导入,在其他任何地方都会失败。

这不是坏掉的导出。这正是平台被要求提供的性质。

配置无法带走的东西

把各项对象与目标会接受的东西对照一下:

对象会转移吗原因
协议与端点会,前提是目标客户端支持配置里的明文
CA 证书与主机名校验通常会公开材料,但主机名仍需与证书匹配
客户端证书会,除非按设备绑定证书可以搬走;能有多少设备共用一张,由签发方决定
私钥只有在 Keystore 之外生成才可以硬件支持的密钥无法导出,只能替换
账号、MFA、SSO 会话不会令牌会过期,并始终绑定在取得它的设备上
路由、DNS 与应用范围只能作为配置文本Android 在连接时通过 VpnService.Builder 应用
分应用代理名单很少包名在不同设备间不同,而名单是客户端状态

大部分混乱来自两行。在设备上生成并标记为不可导出的密钥,确实会随应用数据一起消失,所以替代方案是新密钥加上为它签发的证书。复制到新手机上的会话令牌通常会在第一次刷新时失效,看起来就像导入失败。

导入是先解析,再请求授权

在接收端,导入是一次解析,随后是一次提交。客户端读取配置,检查每个被引用的块是否存在,然后把隧道定义写进自己的沙箱,这就是为什么你从“下载”里选中的文件并不是之后真正连接的东西。

接着是一个任何文件都跳不过的授权步骤。Android 要求应用调用 VpnService.prepare() 并取得你的同意,才能建立隧道,所以刚导入的配置仍会弹出一次系统对话框。然后隧道通过 addAddress、addRoute、addDnsServer,以及用于分应用路由的 addAllowedApplication 或 addDisallowedApplication 显式构建。这些都不是端点所能蕴含的,所以同一份配置在两个客户端里可能产生不同的生效路由集。

基于证书的方案还多一个分叉。当服务器为某台设备签发证书时——MDM 和 SCEP 注册就是这样——在第二台手机上复用它,要么一直可用到服务器强制每个身份只能有一个会话,要么在 TLS 握手中失败。计划复用之前,先确认签发方的策略。

在退役旧设备之前验证新设备

让旧手机保持连接,直到新手机通过了比绿色图标更实在的检查。确认新设备的出口地址,以及它实际使用的 DNS 解析器。如果 split tunneling 对你有意义,就同时打开一个应当绕过隧道的应用和一个不应当绕过的应用,看看哪一个走到了你的运营商。

一项检查就能定下出口地址。在手机浏览器里打开 https://ifconfig.me,然后从同一 Wi-Fi 下的笔记本电脑运行 curl -s https://ifconfig.me,把两个答案与运营商分配给你的地址对比。

到这时才退役旧身份,而且要通过签发方来做:吊销证书,或把设备从账号里移除。从“下载”里删文件什么也没结束,因为两台持有同一张证书的设备,在服务器日志里看起来一模一样。

如果导出结果不可搬移,解决办法是重新注册,而不是一份公开的配置包。索要第二台设备的配置,或者在新手机上生成密钥对并提交 CSR;慢一些,但这是签发方支持的路。

删除任何东西之前先跑一遍清单:新设备能连上,出口地址与 DNS 一致,分应用范围符合预期,旧身份已吊销,保留下来的任何配置文件都在加密存储里。

相关文章