新的 .gnupg 目录:将旧密钥导入新安装

新的 .gnupg 目录:将旧密钥导入新安装

我已经重新安装了操作系统(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

相关内容