gpg解密失败,没有密钥错误

时间:2015-02-04 12:42:36

标签: unix encryption public-key-encryption gnupg

我有一个gpg .key文件,用作解密.dat.pgp文件的密码。使用以下命令

在一台服务器上使用相同的.key文件成功解密加密的.data.pgp文件
cat xxx_gpg.key | /usr/bin/gpg --batch --quiet -o xxx.dat --passphrase-fd O -d xxx.dat.pgp

但是,当我将相同的密钥移动到另一个服务器xxx_gpg.key并运行相同的上述命令时,我收到以下错误 -

gpg: decryption failed: No secret key

编辑:

我发现gpg --list-secret-keys会在服务器上返回一些数据,但不会为其他服务器返回任何结果。

我们如何配置密钥

11 个答案:

答案 0 :(得分:25)

我刚刚在Arch Linux的gpg CLI上遇到过这个问题。我需要杀死现有的“gpg-agent”进程,然后一切都恢复正常(一个新的gpg-agent自动启动; ...)。

答案 1 :(得分:17)

看起来密钥不在另一台机器上,所以即使使用正确的密码(从文件中读取)它也无法正常工作。

这些选项应该适用于

  • 将密钥环(可能只需要密钥密钥,但公共密钥是公共密钥)复制到另一台计算机上
  • 或导出密钥&然后将其导入另一台机器

来自man gpg的一些有用的选项:

  

--export
  从所有密钥环导出所有密钥(默认密钥环和那些密钥环                 通过选项--keyring注册,或者如果给出至少一个名称,                 给定名称的那些。新密钥环写入STDOUT或                 选项--output给出的文件。与--armor一起使用                 邮寄这些钥匙。

     

--export-secret-keys
               与--export相同,但改为导出密钥。

     

--import
  --fast-import
               导入/合并密钥。这会将给定的密钥添加到密钥环。快的                 版本目前只是一个同义词。

也许

  

--keyring file
               将文件添加到当前密钥环列表中。如果文件以波浪号开头                 和斜杠,这些由$ HOME目录替换。如果文件 -                 name不包含斜杠,假定它位于GnuPG主页中                 目录("〜/ .gnupg"如果不使用--homedir或$ GNUPGHOME)。

     

请注意,这会将密钥环添加到当前列表中。如果意图是                 要单独使用指定的密钥环,请使用--keyring--no-default-keyring

     

--secret-keyring file
               与--keyring相同,但是对于秘密密钥环。

答案 2 :(得分:4)

我试图使用 aws-vault,它使用 passgnugp2 (gpg2)。我使用的是在 WSL2 中运行的 Ubuntu 20.04。

我尝试了上述所有解决方案,最终,我不得不再做一件事 -

$ rm ~/.gnupg/S.*                    # remove cache
$ gpg-connect-agent reloadagent /bye # restart gpg agent
$ export GPG_TTY=$(tty)              # prompt for password
# ^ This last line should be added to your ~/.bashrc file

这个解决方案的来源来自一些blog-post in Japanese,幸运的是有谷歌翻译:)

答案 3 :(得分:2)

从一台计算机迁移到另一台计算机时-

  1. 检查两个系统之间的gpg版本和支持的算法。

    gpg --version

  2. 检查两个系统上是否存在密钥。

    gpg --list-keys

    客栈 4096R / 62999779 2020-08-04 sub 4096R / 0F799997 2020-08-04

    gpg --list-secret-keys

    4096R / 62999779 2020-08-04 ssb 4096R / 0F799997 2020-08-04

检查另一台机器上是否存在同一对密钥ID 。对于解密,仅需要秘密密钥(sec)和秘密子密钥(ssb)。

如果另一台计算机上没有该密钥,请从存在密钥的计算机中将密钥导出到文件中,将其压缩,然后将其导入丢失的计算机中。

请勿在新计算机上使用相同的密码短语,名称和用户详细信息重新创建密钥,因为新生成的密钥将具有新的唯一ID,并且如果源使用先前生成的公共密钥进行操作,则仍会出现“无秘密密钥”错误加密。因此,导出和导入将确保使用相同的密钥ID进行解密和加密。

gpg --output gpg_pub_key --export <Email address>
gpg --output gpg_sec_key --export-secret-keys <Email address>
gpg --output gpg_sec_sub_key --export-secret-subkeys <Email address>

gpg --import gpg_pub_key
gpg --import gpg_sec_key
gpg --import gpg_sec_sub_key

答案 4 :(得分:1)

如果您在安装了GPG 2.x的系统上尝试su加密其他用户时解密机密,有时还会收到此错误。 This bug has been reported against RHEL 6,但没有可用的修复程序;显然,这是由于GPG 2.x中的某些设计决策所致。错误报告中建议的一种解决方法是在tmux或屏幕会话内部运行解密。 More reading here

答案 5 :(得分:1)

如果终端窗口太小,在使用实用程序pass 时会出现此错误!

只需将终端窗口高几行。

非常混乱。

答案 6 :(得分:1)

我已经解决了这个问题,尝试使用root特权,例如sudo gpg ... 我认为无权限提升的gpg并不是指文件权限,而是系统

答案 7 :(得分:0)

遵循此过程对我有用。

创建gpg密钥。 gpg --gen-key --homedir /etc/salt/gpgkeys

导出公共密钥,秘密密钥和秘密子密钥。

gpg --homedir /etc/salt/gpgkeys --export test-key > pub.key
gpg --homedir /etc/salt/gpgkeys --export-secret-keys test-key > sec.key
gpg --homedir /etc/salt/gpgkeys --export-secret-subkeys test-key > sub.key

现在使用以下命令导入密钥。

gpg --import pub.key
gpg --import sec.key
gpg --import sub.key

验证密钥是否已导入。

gpg --list-keys
gpg --list-secret-keys

创建示例文件。

echo "hahaha" > a.txt

使用导入的密钥加密文件

gpg --encrypt --sign --armor -r test-key a.txt

要解密文件,请使用以下命令。

gpg --decrypt a.txt.asc

答案 8 :(得分:0)

尝试通过su - <otherUser>从其他用户帐户解密密钥时,我遇到了相同的错误。 (就像jayhendren的建议一样)

在我的情况下,发生这种情况是因为通常会启动图形pinentry提示符,因此我可以输入密码来解密密钥,但是发给用户的su -不能访问(图形)当前正在运行的X-Window-System。

解决方案是简单地在同一控制台中发布(与当前正在运行X Server的用户):

xhost +local:

这赋予其他本地用户访问当前运行的(本地)X服务器的权限。之后,出现pinentry提示,我可以输入密码来解密密钥,它可以工作...

当然,您也可以通过ssh连接转发X。为此,请查看ssh的{​​{1}}参数(客户端)和-X(服务器端)。

答案 9 :(得分:0)

您也可以对此处的最高答案感兴趣: https://askubuntu.com/questions/1080204/gpg-problem-with-the-agent-permission-denied

基本上,对我也有效的解决方案是:

gpg --decrypt --pinentry-mode=loopback <file>

答案 10 :(得分:0)

问题是默认 pinentry 不能通过 ssh 远程工作(即使使用 -X 选项)。解决方案:

sudo update-alternatives --config pinentry

选择 pinentry-cursespinentry-tty 选项。

现在您可以远程使用 gpg,而无需像 pinentry-mode 这样的变通选项。

相关问题