Android 上保存的 VPN:你能恢复哪种机密?
一个无需询问密码即可重新连接的手机,并不会保存你能复制的密码。比较四种凭据以及各自所需的恢复方式。
手机每天早上无需询问任何东西就能重新连接到 VPN。这意味着凭据就在其中的某个地方。通常并非如此,至少不是你能读出来再输入到新设备里的形式。
手机拥有的是连接权限。你想要的是可以带走的机密,而这是两种不同的属性,只是恰好产生了相同的屏幕表现。
在重置任何东西之前,先确定四种机密中究竟缺少哪一种,因为每一种都有不同的所有者和不同的恢复方式。
能用的连接不等于保存的密码
一个静默重连的应用可能持有密码、会话令牌、证书引用,或者只是一把无法导出的设备绑定密钥。四者带来相同的用户体验,但没有一种可以互换。
设置栏里的一行圆点是渲染选择,不是证据。有些应用确实保存可恢复的密码,并提供显示或导出;另一些从单点登录流程取得令牌,根本看不到密码。
所以第一个问题不是文件在哪里。而是应用被授予了哪种权限,而这个答案来自服务提供方,不是设备。
四种机密,四种恢复
在联系任何人之前,先把你的情况对应到一行,因为请求会因是哪一种而完全不同。
| What is missing | Who can restore it |
|---|---|
| Account password used with a username | The identity provider, through a reset |
| Password protecting a private key or PKCS#12 package | Nobody, if it is forgotten; a fresh profile and key are issued instead |
| Session token or SSO session | Nobody; sign in again to obtain a new session |
| Reference to a certificate or key held on the device | The administrator, by enrolling the new device |
第二行最常让人中招。PKCS#12 导入密码保护密钥材料,与账户登录无关,所以重置账户密码什么也恢复不了。如果包密码确实丢失,解决办法是重新签发。
第四行解释了许多令人困惑的支持帖。配置文件可能引用平台密钥库中的凭据,而不是包含可移植副本,在这种情况下,配置文件里原则上也没有任何可提取的东西。
为什么复制应用数据通常行不通
旧办法是把应用的数据目录拉出来,再从中读取配置。在当前的 Android 上,这个办法有两个彼此独立的问题。
第一个是备份策略。Android 12 限制了面向 API 31 或更高版本的应用通过旧的 adb backup 路径导出的应用数据,而且应用可以完全将数据排除在备份之外。为旧设备写的步骤并非当前设备的通用恢复方法。
第二个是密钥库。在那里生成的密钥可能不可导出,并且与硬件绑定,Android Keystore 文档对此有说明。复制加密数据块并不会复制解密它的密钥,所以恢复出来的目录里可能含有新设备永远无法使用的凭据。
这两个问题都不是需要绕过的缺陷。两者都是平台按设计行事,把它们当作障碍,通常以手机被 root 而密码仍未找回告终。
有意识地换到替换手机
先做受支持的事。如果提供方提供的导出明确包含你需要的凭据,就用它,并在抹掉旧设备之前先在新设备上验证结果。如果没有,就申请新的配置文件或注册,这是基于证书的服务的常规路径,通常比绕路花的时间更少。
顺序很重要。注册替换设备、连上它、通过隧道发一个测试请求,然后才让原设备退役。在新设备被证明可用之前保留那台能用的手机,是现有最便宜的保险,代价只是耐心。
也要为重置的副作用做计划。如果账户密码被重置或设备身份被吊销,其他会话可能失效,包括笔记本客户端和一台谁也没想起的平板。要在同一个时间窗口里处理,而不是一个个发现。
不要做的事
不要为了找明文文件而 root 唯一能用的设备。你把访问恢复问题变成了设备完整性问题,可能破坏应用自身的完整性检查,而且仍然无法保证你找的值以可读形式存在。
不要把私钥、导出的配置文件或密码贴进支持工单来证明问题真实存在。提供方需要的是配置文件名称、应用版本、账户标识和错误信息,这些都不是机密。
也不要在等待时为了获得连接而关闭证书校验。那是用暂时的麻烦,换取唯一能告诉你正在与哪台服务器通信的检查被永久削弱。记录四个事实,提出具体问题,走正式渠道。