GPG 密钥迁移指南:多私钥备份、批量导入与自动信任

在进行服务器迁移或多节点部署时,经常需要将旧服务器上的 GPG 私钥迁移至新服务器,以便自动化脚本(如数据备份解密、敏感配置读取等)能够无缝运行。

本文将详细介绍如何从旧服务器安全导出多个 GPG 私钥,并在新服务器上完成批量导入免交互批量信任及验证的完整流程。

一、旧服务器:导出私钥

在旧服务器上,我们需要找出需要迁移的私钥,并将它们安全地导出为文本文件(Armor 格式)。

1. 查看现有私钥及 Key ID

运行以下命令,列出系统里所有的私钥:

Bash

复制代码
gpg --list-secret-keys --keyid-format LONG

输出示例:

Plaintext

复制代码
sec   rsa3072/88ED0FAF 2023-10-10 [SC] [expires: 2028-10-08]
      Key fingerprint = 1234 5678 90AB CDEF ...
uid         [ultimate] Backup Key <backup@example.com>
ssb   rsa3072/A1B2C3D4 2023-10-10 [E]

注意sec 行中斜杠 / 后面的 88ED0FAF 就是该私钥的 Key ID

2. 导出指定私钥

使用以下命令,将对应的私钥导出为 .asc 格式的文件(替换 YOUR_KEY_ID 为实际的 Key ID,如 88ED0FAF):

Bash

复制代码
gpg --armor --export-secret-keys YOUR_KEY_ID > private_key_YOUR_KEY_ID.asc

如果有多个私钥,重复此步骤导出成多个不同的 .asc 文件即可。

⚠️ 安全警告 :导出的 .asc 文件包含私钥明文,请通过安全的通道(如 scpsftp)传输到新机器,切勿上传至任何公开的 Git 仓库、网盘或聊天软件中!

二、新服务器:导入与配置

将导出的 .asc 私钥文件安全传输到新服务器后,执行以下操作。

1. 批量导入私钥

在新服务器上,可以直接一次性导入当前目录下的所有 .asc 私钥文件:

Bash

复制代码
gpg --import *.asc

在导入过程中,系统可能会提示你输入各个私钥在创建时设置的密码(Passphrase)。

2. 免交互批量设为"绝对信任"(核心步骤)

由于 GPG 的安全机制,新导入的密钥默认处于"未信任"状态。在非交互式脚本中运行解密时,可能会因为安全警告导致脚本挂起或报错。

如果私钥较多,手动通过 gpg --edit-key 授权非常繁琐。运行下面这行命令,可以一键将新机器上导入的所有私钥批量设置为"绝对信任(Ultimate Trust)"

Bash

复制代码
gpg --list-secret-keys --with-colons | grep '^sec' | cut -d: -f5 | xargs -I {} sh -c 'echo "{}:6:" | gpg --import-ownertrust'

原理剖析:

  • gpg --list-secret-keys --with-colons:以冒号分隔的机器可读格式列出所有私钥。

  • grep '^sec' & cut -d: -f5:过滤出私钥行,并提取出所有的 Key ID。

  • gpg --import-ownertrust:通过输入流直接将对应 Key ID 的信任级(6 代表 Ultimate/无限信任)导入到 GPG 信任库中,实现了免人工交互的批量授权。

3. 验证导入与信任状态

运行以下命令,验证私钥是否已成功导入并获得信任:

Bash

复制代码
gpg --list-secret-keys --keyid-format LONG

在输出结果中,如果看到 uid 前面带有 [ultimate] 标识,说明该私钥已成功导入并被系统完全信任:

Plaintext

复制代码
sec   rsa3072/88ED0FAF 2023-10-10 [SC] [expires: 2028-10-08]
uid         [ultimate] Backup Key <backup@example.com>

三、安全清理与测试

1. 清理临时私钥文件

一旦验证无误,务必立即彻底删除 新服务器和中转机上的 .asc 备份文件,防止私钥泄露:

Bash

复制代码
rm -f *.asc

2. 脚本解密测试

重新运行你的 shell 脚本。在多私钥环境下,GPG 会自动读取加密文件的"收件人标识(Recipient Key ID)",并去新机器的钥匙环(Keyring)中匹配对应的私钥,配合脚本中提供的 $GPG_PASSPHRASE 完成解密,无需额外手动指定私钥。

相关推荐
Eloudy16 小时前
git format-patch 、git diff 与 git apply
git·构建
技术小结-李爽17 小时前
【工具】git安装及配置
git
0xR3lativ1ty19 小时前
每日GitHub trending精选
github
带娃的IT创业者19 小时前
GitHub 热门项目解析:当 AI 编码助手遭遇“上下文爆炸”
人工智能·github·代码优化·ai编程助手·上下文窗口·上下文压缩
白鲸开源1 天前
Apache SeaTunnel 提交一个任务都经过了什么?
大数据·开源·github
dong_junshuai1 天前
每天一个开源项目#60 TencentDB Agent Memory:1.4万星的团队记忆中枢
github·腾讯
dong_junshuai1 天前
每天一个开源项目#61 3.9K Stars:Cloudflare 给 Agent 一台持久云电脑
程序员·github
橙序员小站1 天前
我把公众号生产链做成了全本地的 AI 工作台 🛠️
程序员·github
技术小结-李爽1 天前
【工具】git与gitee和gitlab和github等等有什么区别?
git·gitee·gitlab
笨鸟先飞,勤能补拙1 天前
AI 安全的下一个 5 年:从 Agent 到 AGI 的攻防博弈
人工智能·python·安全·web安全·网络安全·github·agi