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

Dia*_*gon 9 export import 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
Run Code Online (Sandbox Code Playgroud)

我想将旧的公钥和私钥导入新的 gnupg。(我没有简单地将 .gnupg 目录复制到新安装中,因为我知道新的 gnupg2 在数据库格式上有一些差异,这些差异是新 EC 加密选项的一部分。)

以下对公钥有效,但对私钥无效:

gpg --export --keyring=~/.gnupg.old/pubring.gpg | gpg --import
gpg --export-secret-keys --keyring=~/.gnupg.old/secring.gpg | gpg --import
Run Code Online (Sandbox Code Playgroud)

后者回应:

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
Run Code Online (Sandbox Code Playgroud)

请注意,它无法打开我的秘密戒指。尝试导出到文件时出现相同的错误:

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
Run Code Online (Sandbox Code Playgroud)

由于我的密钥已剥离了主密钥的私有部分,我也尝试了相同的方法,使用--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 <Me@home.com>" ....
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
Run Code Online (Sandbox Code Playgroud)

(我假设“丢失的密钥”是指被剥离的秘密主密钥。)谁能指导我如何解决这个问题?

在@Jens(如下)的帮助下,以下工作:

gpg --no-default-keyring --secret-keyring=~/.gnupg.old/secring.gpg --export-secret-keys | gpg --import
Run Code Online (Sandbox Code Playgroud)

Jen*_*rat 7

首先,你在做一种“无操作”。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 文件转换为 keybox 格式,首先要备份 ownertrust 值,然后将文件重命名为(例如)publickeys,这样它就不会被任何 GnuPG 版本识别,然后运行导入,最后恢复ownertrust 价值观:

$ cd ~/.gnupg
$ gpg --export-ownertrust >otrust.lst
$ mv pubring.gpg publickeys
$ gpg2 --import-options import-local-sigs --import publickeys
$ gpg2 --import-ownertrust otrust.lst
Run Code Online (Sandbox Code Playgroud)

然后,您可以将 publickeys 文件重命名回,以便旧的 GnuPG 版本可以使用它。请记住,在这种情况下,您有两个独立的公钥副本。ownertrust 值由所有 gpg 版本保存在文件 trustdb.gpg 中,但需要采取上述预防措施以在导入时保留它们。

考虑到您发布的错误消息,新主~/.gnupg目录或密钥环的某些权限似乎~/.gnupg/secring.gpg不足以创建密钥。如果不小心从 root 用户调用了 GnuPG,这通常会发生。

来自的消息--list-keys不是正常输出,但似乎是错误消息。要打印任意密钥环,请使用--no-default-keyringand--secret-keyring选项和--list-secret-keyscommdn(并且通常在 GnuPG 命令之前总是有选项):

gpg --no-default-keyring --secret-keyring=secring.gpg --list-secret-keys
Run Code Online (Sandbox Code Playgroud)