我有一个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
会在服务器上返回一些数据,但不会为其他服务器返回任何结果。
我们如何配置密钥
答案 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,它使用 pass 和 gnugp2 (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)
从一台计算机迁移到另一台计算机时-
检查两个系统之间的gpg版本和支持的算法。
gpg --version
检查两个系统上是否存在密钥。
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-curses
或 pinentry-tty
选项。
现在您可以远程使用 gpg,而无需像 pinentry-mode 这样的变通选项。