备份与还原
这张卡的价值全在"卡上私钥"上,而私钥不可导出、不可迁移。备份功能解决的场景是: 本机重装系统之后,把卡原样恢复出来。
三条硬前提(先看这里)
- 同一颗 TPM:只能在本机(同一颗 TPM)还原。换机器、换 TPM、清除过 TPM 都不行 —— 卡上私钥的父密钥在源机 TPM 内,任何软件都无法还原它。
- 卡片没有被删除:
tpmvscmgr destroy会一并清除该卡在 TPM 内的持久密钥, 删除之后再好的备份也恢复不出这张卡。 - 还原后可能需要重启:卡片常常要等重启设备(驱动)或重启系统之后,才会出现在读卡器列表中。
1. .tsb 里有什么
一张可用的虚拟智能卡由五个部分组成,备份会把这五部分全部收进包(zip 格式):
| 路径 | 内容 | 缺失后果 |
|---|---|---|
files/<store GUID>/… | 卡片数据目录(含 DPAPI 密文原样副本) | 卡片没有内容 |
dpapi/<store GUID>/… | 5 个 DPAPI 文件的明文(源机解密结果) | 目标机建不出密钥容器 → 证书不显示 |
pcp/<i>/… | TPM 密钥索引 *.PCPKEY(3 个候选目录) | 驱动找不到卡上密钥 |
registry/*.reg | 设备类实例与设备节点注册表导出 | 设备节点无法重建(读卡器不出现) |
tpmvsc-backup.json | 清单:机器、工具版本、文件校验和、设备属性、DPAPI 记录、TPM 型号与 EK 指纹 | 无法还原 |
store-index.txt | 目录清单,仅供诊断 | 无 |
五部分为什么缺一不可、依赖顺序是什么,见 工作原理 §2。
2. 安全性:.tsb 等同于密钥材料
为了让目标机能解开卡片密钥与 PIN 映射,包内含这 5 个文件的 DPAPI 明文(清单里的 notes 也会明确写出这一点)。因此:
- 拿到包的人不能直接"签走"卡上私钥(私钥仍在 TPM 内),但可以读取卡内数据与 PIN 映射, 并能在有权限的机器上重建同样的卡片文件结构;
- 包内还含设备注册表与设备属性(卡片名、store 路径、卡片 GUID),可推断环境信息。
请这样保管:
| 建议 | 说明 |
|---|---|
| 离线保存 | 放进加密移动盘或密码管理器附件,不要留在系统盘根目录/桌面 |
| 不要进版本库、云盘、聊天工具 | 一旦外泄等同交出卡片密钥材料 |
| 限制访问 | 只有卡的主人本人可读 |
| 同时保管凭据 | 卡片名称、PIN、PUK、管理密钥一起存进密码管理器 |
| 不要把包发给支持人员 | 排查问题只需要日志(见 故障排查手册 §5) |
目前
.tsb没有整包加密(设计上列为扩展点,见 备份还原设计 §10)。 因此包的安全等级完全取决于你怎么保管它。
3. 备份操作
- 确认卡片处于可用状态(列表里能看到、
certutil -scinfo -silent正常); - 在「智能卡管理」里选中卡片 → 💾 备份智能卡;
- 选择保存位置与文件名(默认
<卡片名>-<实例编号>.tsb); - 过程中会依次收集:设备注册表 → 卡片数据目录(含 sha256 校验)→ TPM 密钥索引 → 设备属性(经 PnP 属性接口读取,绕开注册表的 ACL 保护)→ 在源机用 DPAPI 解密成明文 → TPM 指纹;
- 完成后界面会给出结论 + 逐条日志 + 现场诊断,并把完整日志写到
%APPDATA%\TPMSmartCard\logs\backup-<时间戳>.log。
备份策略建议
- 建卡后立刻备份一次(此时状态最干净);
- 之后每当导入新证书 / 换 PIN 后,重新备份一次(备份会覆盖旧包,建议保留多个时间点);
- 备份时最好记下当时的卡片名称、PIN、PUK、管理密钥,它们不在清单里;
- 想验证备份是否可用,最稳的方式是在本机重装系统前先做一次"演练":备份 → 还原 → 确认卡片可读、 证书可见(同一颗 TPM 上可以反复还原,还原是幂等的)。
4. 还原操作
装好新系统后,安装本工具(同架构),确认 TPM 就绪(同一颗 TPM);
选中
.tsb(双击已关联的备份包,或在界面里点 ↩ 还原智能卡 选择文件);工具会按固定顺序执行(顺序不可调换):
步骤 动作 R1 读清单、校验包完整性(sha256) R2 导入注册表(设备类 + 设备节点) R3 用 SetupDi重建 PnP 设备节点(只reg import是建不出设备的)R4 写回卡片数据;其中 DPAPI 文件用本机 DPAPI 按备份记录的账户与作用域重新加密 R5 写回 TPM 密钥索引(同名文件不覆盖,避免破坏本机其它 TPM 密钥) R6 写回设备属性:卡片身份不一致则覆盖,其余只补缺失;属性里的绝对路径按目标机 %SystemRoot%改写R7 重新枚举设备、刷新相关服务,让驱动重读属性 R8 判定「设备节点 / 读卡器 / DPAPI」三层状态并给出结论 如果卡片没出现:先重启一次(重启设备驱动或重启系统),再看结论;
日志在
%APPDATA%\TPMSmartCard\logs\restore-<时间戳>.log。
还原结论怎么读
| 判定 | 取值 | 含义 |
|---|---|---|
| 设备节点 | started / present / missing / problem | 设备树里有没有这张卡 |
| 读卡器 | card(读卡器 + 卡都在)/ reader_only / absent | PC/SC 层面卡片是否发布 |
| DPAPI | ok / fail / none | 卡上 DPAPI 数据在本机能否解开 |
关键规则:读卡器 = card 但 DPAPI = fail 时不算成功 —— 此时证书与私钥都不会显示, 结论会明确要求"用新版工具在源系统重新备份后还原"。
5. 常见失败与处理速查
| 现象 | 原因 | 处理 |
|---|---|---|
| 还原后读卡器不出现 | 设备节点没建出来 / 卡片身份属性缺失 / TPM 密钥索引缺失 | 看结论的三层判定,按 故障排查手册 §2 逐条核对 |
| 读卡器出现但卡片没加载 | 设备→store 绑定未生效,或卡片数据与 TPM 密钥不匹配 | 重启后再还原一次;确认备份来自本机同一张卡 |
| 卡片在、证书不显示 | 卡上密钥/PIN 数据在本机解不开(DPAPI 层) | 用新版本工具在源系统重新备份后再还原 |
| 提示 TPM 指纹不一致 | 备份来自另一颗 TPM | 卡上私钥无法恢复;卡片与证书可以重建,但需要重新签发证书(工具会询问是否继续,默认不继续) |
| 用旧版本工具做的包还原失败 | 旧包不含设备属性与 DPAPI 明文 | 用新版本重新备份;旧包只能重建部分内容 |
| 提示"包格式版本高于本工具支持" | 工具太旧 | 升级工具 |
6. 为什么要"解密再加密"
卡片数据(keymaps / pinmaps / pinpolicy / blobs\*)是用户作用域的 DPAPI blob, 主密钥在源机、由 TPM 保护,换系统后根本取不到。所以设计上:
- 解密只发生在源机(备份时),加密只发生在目标机(还原时);
- 工具不导出、不缓存、不写盘任何 DPAPI 主密钥 —— 搬主密钥会连带解密同账户的其它受保护数据, 暴露面不可接受;
- 解密卡片数据需要 SYSTEM 身份(数据是服务账户写的),因此工具以管理员身份运行时 会临时借用 SYSTEM 令牌,借用前校验账户 SID、借用后做一次 DPAPI 往返探针确认可用, 用完立即恢复自身身份;
- 重新加密后会立刻解密回验,不一致就退回原始密文写回(宁可不更新,也不写坏卡)。
设计细节与决策记录见 备份还原设计,实现过程与真机证据见 备份还原技术报告。
下一步:常见问题。