【问题标题】:gpg decryption fails with no secret key errorgpg 解密失败,没有密钥错误
【发布时间】:2015-04-03 23:52:19
【问题描述】:

我有一个 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 在它工作的服务器上返回了一些数据,但没有返回其他服务器的结果。

我们如何配置密钥

【问题讨论】:

  • 每台机器上的 gpg 版本完全相同?
  • 两个地方的 gpg 版本相同 - 2.0.14
  • 嗯。显然--passphrase-fd 只读取“第一行”,它们在每个系统上看起来都相同吗?也许不同的外壳正在以不同的方式转换或管道它们?刚刚看到一个反斜杠被读取“吃掉”的案例......
  • 密码在所有地方都是一样的,唯一的区别是我在帖子中也编辑了 gpg --list-secret-keys 列出的不同
  • 我原以为您使用的是“传统”加密,应该更早地想到公钥/私钥加密,但也混淆了“密钥文件”和“密钥”。我会发布一些选项/想法

标签: unix encryption public-key-encryption gnupg


【解决方案1】:

我刚刚在 Arch Linux 的 gpg CLI 上遇到了这个问题。我需要终止现有的“gpg-agent”进程,然后一切恢复正常(当您再次调用 gpg 命令时,新的 gpg-agent 应该会自动启动;...)。

  • 编辑:如果进程无法重新加载(例如,在一分钟内),请在终端中执行 gpg-agent 和/或重新启动...

【讨论】:

  • 这正是我的问题,并且修复了 - 我在没有代理的情况下使用 gpg 有一段时间了,显然它现在默认启用了?也许在 ubuntu 17.04 中,我现在(意外地)正在运行它。 :-) 我猜它还是有问题的。
  • 同样的问题并在 macOS 上为我修复。之前的解密不知何故出了差错,导致了上述错误。
  • ... 只是添加,在 macOS 上,杀死 gpg-agentgpgconf --kill gpg-agent 一起工作;无需专门重启代理。
  • 对我来说,我的终端太小了。让它更大,以便在 gpg 中输入密码短语为我修复了它。这真的很烦人。我相信有一种方法可以在某处保存密码。但是,如果有一个用于较小终端屏幕的界面而不是仅仅导致命令失败,那就太好了......
【解决方案2】:

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

这些选项应该可以工作

  • 要么将密钥环(可能只需要秘密密钥环,但无论如何公共环是公开的)复制到另一台机器上
  • 或者导出密钥,然后在另一台机器上导入

man gpg 提供的一些有用的外观选项:

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

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

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

也许

--keyring file
将文件添加到当前的密钥环列表。如果文件以波浪号开头 和一个斜线,它们被 $HOME 目录替换。如果文件- name 不包含斜杠,假定在 GnuPG home 中 目录(如果不使用 --homedir 或 $GNUPGHOME,则为“~/.gnupg”)。

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

--secret-keyring file
--keyring 相同,但用于密钥环。

【讨论】:

  • 短版: # 从另一台机器导入密钥: gpg --export ${ID} > public.key gpg --export-secret-key ${ID} > private.key # 复制这些文件到另一台机器上 gpg --import public.key gpg --import private.key # from unix.stackexchange.com/questions/184947/…
  • 以上正是我尝试过的,也是导致我看到 OP 发布的错误消息的原因。
  • @aioobe 正确的(秘密)密钥不能被其他 gpg 访问或看到。你的意思是你试过YaroslavNikitenko的命令吗?我没有测试过它们,但它们看起来不错,只要$ID 是对的。我会尝试--output,但没关系。导出密钥然后导入它应该工作,它是否显示在--list-keys(-k 或 -K)中?或者复制整个密钥环文件然后使用--keyring 绝对应该......我在使用--passphrase-file 之前遇到了gpg-agent 不读取密码的问题,或者用一些@ 替换--quiet--batch 987654343@'s
  • 我做了--export / --import 的事情。问题原来是我们在“接收”(--import)机器上使用了gpg 而不是gpg2。不能说为什么。它们应该是兼容的,但似乎在某些情况下它们不兼容。
  • 这很令人失望,希望这只是一个小错误,很快就会得到修复,向后兼容性是一大优势
【解决方案3】:

我试图使用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,幸好有谷歌翻译:)

【讨论】:

  • 也适用于在 WSL2 中运行的 Ubuntu 18.04
  • 也适用于 macOS
【解决方案4】:

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

只需将终端窗口高几行即可。

非常混乱。

对怀疑者的解释。这是使用curses 版本的pinentry 时的问题,如here 所述:“由于他们使用curses 绘制对话框的方式,pinentry-curses 仅适用于大于 10 行高的终端"

【讨论】:

  • 我认为你的观点是正确的。忽略这一点可能会导致不必要的混乱。所以我再次投票给你:)
  • 天哪,我从没想过这会是个问题。这完全解决了我的问题
  • 你应该得到一百万个赞。我有这个确切的问题。我用谷歌搜索并找到了你的答案。我能够轻松解决问题。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    当从一台机器迁移到另一台机器时-

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

      gpg --version

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

      gpg --list-keys

      pub 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

    检查另一台机器上是否存在相同的key ids对。解密只需要密钥(sec)和子密钥(ssb)。

    如果另一台机器上不存在密钥,则从存在密钥的机器上导出文件中的密钥,scp 文件并在缺少密钥的机器上导入密钥。

    不要在新机器上使用相同的密码、名称、用户详细信息重新创建密钥,因为新生成的密钥将具有新的唯一 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
    

    【讨论】:

      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

        遵循此程序对我有用。

        创建 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" &gt; a.txt

        使用导入的密钥加密文件

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

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

        gpg --decrypt a.txt.asc

        【讨论】:

          【解决方案9】:

          我在尝试通过 su - &lt;otherUser&gt; 从其他用户帐户解密密钥时遇到了同样的错误。 (就像 jayhendren 在他的回答中建议的那样)

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

          解决方案是简单地在同一个控制台中发出(作为 X 服务器当前运行的用户):

          xhost +local:

          这使其他本地用户可以访问当前运行的(本地)X-Server。之后出现pinentry提示,我可以输入密码解密密钥,成功了……

          当然你也可以通过ssh 连接转发X。为此请查看ssh-X 参数(客户端)和X11Forwarding yes(服务器端)。

          【讨论】:

          • 我认为这是我的问题。关于如何让它在 tty 上提示并忽略 pinentry 的任何想法?
          • 您可以尝试将其添加到您的~/.gnupg/gpg-agent.confpinentry-program /usr/bin/pinentry-tty 如果缺少 pinentry-tty,请安装它。此外,之后重新加载您的连接代理,如下所示:gpg-connect-agent reloadagent /bye
          • 在我的情况下,我尝试使用 su 对其他用户进行解密,但失败了。之后,我无法使用正确的用户进行加密,也不知道出了什么问题。我在 linux rhel 上使用 pgp
          • 你确定它以前有效吗?您的评论没有提供足够的信息来得出任何建议。
          • 有一些 pinnentry 实现非常糟糕,我已经解决了这个问题,使用更新替代方案来选择一个有效的替代方案。
          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

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

            sudo update-alternatives --config pinentry

            选择pinentry-cursespinentry-tty 替代方案。

            现在您可以远程使用 gpg,而无需使用 pinentry-mode 等解决方法。

            【讨论】: