我已经重新安装了操作系统(Ubuntu 16.04),并且有一个旧的 .gnupg 目录,其中包含:
gpg-agent.conf
gpg-agent-info-<hostname>
gpg.conf
private-keys-v1.d
pubring.gpg
secring.gpg
S.gpg-agent
trustdb.gpg
我想将我的旧公钥和私钥导入新的 gnupg。(我没有简单地将 .gnupg 目录复制到新安装中,因为我知道新的 gnupg2 在数据库格式上有一些差异,这是新 EC 加密选项的一部分。)
以下操作对公钥有效,但对私钥无效:
gpg --export --keyring=~/.gnupg.old/pubring.gpg | gpg --import
gpg --export-secret-keys --keyring=~/.gnupg.old/secring.gpg | gpg --import
后者回应道:
gpg: can't open `~/.gnupg/secring.gpg' <== New Secret Keyring
gpg: WARNING: nothing exported
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0
请注意,它无法打开我的新的secret ring。尝试导出到文件时出现同样的错误:
gpg --export-secret-keys --keyring=~/.gnupg.old/secring.gpg > secret.asc
gpg: can't open `~/.gnupg/secring.gpg' <== New Secret Keyring
gpg: WARNING: nothing exported
由于我的密钥已剥离了主密钥的私有部分,因此我也尝试了相同的操作,使用--export-secret-subkeys
,但响应相同。在导出后放置我的密钥 ID(电子邮件地址)也不起作用。另一方面,我可以列出密钥:
gpg --list-keys --keyring=~/.gnupg.old/secring.gpg
gpg: Oops; key lost!
node 0x1e7ee00 01/00 type=secret-key
node 0x1e9cbd0 00/00 type=user-id "Me <[email protected]>" ....
node 0x1e99dd0 00/00 type=signature class=13 keyid=XXXXXXXX ts=1383637282
node 0x1e9c510 00/00 type=secret-subkey
node 0x1eaa210 00/00 type=signature class=18 keyid=XXXXXXXX ts=1449138073
node 0x1eaf1f0 00/00 type=secret-subkey
node 0x1eaf580 00/00 type=signature class=18 keyid=XXXXXXXX ts=138363647
(我假设“密钥丢失”是指被剥离的秘密主密钥。)有人能告诉我如何解决这个问题吗?
在@Jens (如下) 的帮助下,可以完成以下工作:
gpg --no-default-keyring --secret-keyring=~/.gnupg.old/secring.gpg --export-secret-keys | gpg --import
答案1
首先,你正在执行一种“无操作”。gpg
在 Ubuntu 16.04 上仍然是 GnuPG 1.4.20,而gpg2
从 GnuPG 2.0.28 跳转到 2.1.11。然后,虽然 GnuPG 2.1 对文件格式进行了一些更改(新的密钥库格式“keybox”/.kbx
并将秘密密钥环合并到公共密钥环中),但它仍然兼容,并且会在第一次调用时执行秘密密钥环合并gpg2
。除非您手动转换。旧格式完全受支持,新格式仅提供性能改进。建议迁移到新密钥箱格式的路径是转换之内旧的 GnuPG 目录,而不是移动到一个全新的目录:
要将现有的 pubring.gpg 文件转换为密钥箱格式,首先要备份所有者信任值,然后将文件重命名为(例如)publickeys,这样它就不会被任何 GnuPG 版本识别,然后运行导入,最后恢复所有者信任值:
$ cd ~/.gnupg $ gpg --export-ownertrust >otrust.lst $ mv pubring.gpg publickeys $ gpg2 --import-options import-local-sigs --import publickeys $ gpg2 --import-ownertrust otrust.lst
然后,您可以将 publickeys 文件重命名,以便旧版本的 GnuPG 可以使用它。请记住,在这种情况下,您有两个独立的公钥副本。所有 gpg 版本都将所有者信任值保存在文件 trustdb.gpg 中,但需要采取上述预防措施才能在导入时保留它们。
考虑到您发布的错误消息,似乎新主~/.gnupg
目录或密钥环上的某些权限~/.gnupg/secring.gpg
不足以创建密钥。如果意外从 root 用户调用 GnuPG,通常会发生这种情况。
来自的消息--list-keys
不是正常输出,但似乎是错误消息。要打印任意密钥环,请使用--no-default-keyring
和--secret-keyring
选项以及--list-secret-keys
命令(并且通常总是在 GnuPG 的命令之前有选项):
gpg --no-default-keyring --secret-keyring=secring.gpg --list-secret-keys