是的,您需要转移密钥。 Mac 和 Linux 的工作原理相同,将密钥存储在~/.gnupg
。传输文件的最安全方法是使用scp
(ssh 的一部分):
scp -rp ~/.gnupg othermachine:
但是,您需要有ssh
首先工作。
使用 USB 闪存驱动器传输它们并不是一个好主意,因为即使您删除了文件,您的私钥也会留在该驱动器上。尽管它受到密码保护,但如果有人掌握了密钥文件的副本,他们就可以在闲暇时对其进行长时间的暴力攻击。
我不知道 Windows 上该目录的位置。 gpg 文档会说,并且内容几乎肯定是相同的。
复制整个密钥环既快速又简单,但有时您希望能够在计算机之间移动单个密钥,而不会覆盖整个密钥环并丢失已有的密钥。可以有选择地复制单个密钥gpg --export-secret-key
and gpg --import
。如果您可以通过 ssh 访问目标计算机,则可以使用管道执行此操作,并且不需要在任何地方存储中间密钥:
如果您使用的计算机已经拥有密钥:
gpg --export-secret-key SOMEKEYID | ssh othermachine gpg --import
如果您所在的机器需要密钥:
ssh othermachine gpg --export-secret-key SOMEKEYID | gpg --import
If gpg
不在远程计算机上的默认位置之一(例如,它位于/opt/local/bin
在 Mac 上)您必须提供 ssh 的完整路径,或将其符号链接到标准位置之一,例如/usr/local/bin
.
请注意,传输的数据仍受密码保护,并且密钥在目标处的密码与源处的密码相同。如果您想在每个位置使用不同的密码,则需要在目标处更改密码,或者在导出之前在源处临时更改密码。我需要与一位同事共享一个密钥,以便他能够更新我们共同管理的 Debian 软件包存储库,但我不想与他共享我的密码。因此,我将密码更改为临时密码,将导出的密钥发送给他(通过 gpg 加密的电子邮件!),口头告诉他临时密码,并要求他在导入密钥后立即设置新密码。然后,我将密钥副本上的密码更改回原来的密码。
更新于2021-03-03
使用 GnuPG 2.0,如果您从远程计算机导出密钥并且没有 X11 连接转发,则在输入密码时可能会遇到问题。例如,gpg
说“无法打开'/dev/tty'”。如果您强制使用伪终端分配ssh -t
密钥与终端活动(例如密码提示和\r
s。解决这个问题的一种方法是:
ssh othermachine gpg --passphrase-fd 0 --pinentry-mode loopback ...
然后您需要输入密码并按 Enter 键。不会出现提示,并且不会抑制回显(因此密码将在您的终端上可见)。如果您对回声感觉强烈,可以使用以下命令暂时将其关闭stty -echo
并再次返回stty echo
。这一切都可以整合到一个命令中,如下所示:
stty -echo; \
ssh othermachine gpg --passphrase-fd 0 --pinentry-mode loopback \
--export-secret-key SOMEKEYID | gpg --import; \
stty echo
但是,您很少需要这样做,因为到目前为止,最常见的情况是从您所在的计算机导出并导入到您通过 ssh 访问的远程计算机。