如何在 CLI 上使 gpg 提示输入密码

Posted

技术标签:

【中文标题】如何在 CLI 上使 gpg 提示输入密码【英文标题】:How to make gpg prompt for passphrase on CLI 【发布时间】:2013-07-20 03:22:26 【问题描述】:

gnuPG 包 gpg 的加密工具在普通用户调用时会使用 GUI 对话框提示输入密码,但是当由 root 调用时,它会在 CLI 上提示。即使由普通用户调用,如何使其使用 CLI。 版本:GnuPG 1.4.12

【问题讨论】:

【参考方案1】:

这种密码提示不是gpg自己做的,而是gpg-agent做的。

您可以配置您的 gpg-agent 应该使用哪个 pinentry 程序。在启动代理时和 gpg-agent 配置文件中都有选项——请看一下手册页。

所以我看到了两个选项:

配置您的 gpg-agent 以使用所需的方法 禁用 gpg 代理;您可以通过取消设置环境变量 GPG_AGENT_INFO 来对单个 gpg 调用执行此操作,例如 GPG_AGENT_INFO="" gpg ...。 gpg 曾经有一个 --no-use-agent 选项,但它已被标记为已弃用,并且在最近的 gpg 版本中没有任何功能。

【讨论】:

我创建了 ~/.gnupg/gpg-agent.conf 并在其中写了pinentry-program /usr/bin/pinentry-curses。没有为我工作!使用 gpg --no-use-agent 成功了。 @MayankPundir 这个选项已经过时了一段时间;我相应地更新了我的答案。 GPG_AGENT_INFO="" gpg ... 为我工作, --no-use-agent 没有。 Ubuntu 14.04 GPG_AGENT_INFO 的使用自 2.1 起无法使用,因为它已被废弃。 对于 MacOS,您可以前往 ? > 系统偏好设置 > GPG 套件,然后禁用“存储在 macOS 钥匙串中”和“记住 ### 秒”和“删除存储的 OpenPGP 密码”。最后一部分非常重要,因为如果您的密码已经存储在钥匙串中,则禁用其他 2 个选项是不够的!希望这会有所帮助,我在更新 gpg 后花了几个月的时间,我不小心启用了这些选项,然后才弄清楚如何恢复它。我还将在下面添加一个帖子以方便查看【参考方案2】:

你可以这样做:

gpg --batch --decrypt --passphrase-fd 0 gpgfile < passphrase-file

【讨论】:

我必须在 Ubuntu Linux 14.04 上添加 --no-use-agent - 否则会出现错误 gpg: can't query passphrase in batch mode\ngpg: error creation passphrase: invalid passphrase\ngpg: 对称加密的` [stdin]' 失败:密码无效【参考方案3】:

您可以设置以下环境变量来禁用图形提示

export PINENTRY_USER_DATA="USE_CURSES=1"

【讨论】:

也不能在 Debian Stretch 上工作 (gnupg 2.1.18)。【参考方案4】:

在 debian 机器上:

sudo apt install pinentry-tty
sudo update-alternatives --config pinentry

(并将其设置为 pinentry-tty)

【讨论】:

经过大量搜索,这是唯一对我有用的解决方案。谢谢! 我认为这是最好的方法,但是稍微解释一下可以改善答案 这将更改您设备上所有帐户的系统范围内的 pinentry 模式,这可能是不可取的。为 gpg-agent 或单次调用 gpg 提供 pinentry 选项不会影响整个系统 一个更简单的,在第二行:sudo update-alternatives --set pinentry /usr/bin/pinentry-tty【参考方案5】:

我使用的是较新的 GPG (2.2.13),gpg-agent 手册页显示:

您应该始终将以下行添加到您的 .bashrc 或用于所有 shell 调用的任何初始化文件中:

GPG_TTY=$(tty)
export GPG_TTY

重要的是此环境变量始终反映tty 命令的输出。 ...

这并不能解释“为什么”(我也不明白“为什么”),但是在我的 .bashrc 中设置它是有效的:它导致我的 gpg-agent 通过 @987654327 询问我的密码@ 界面。我不需要设置任何其他配置(我什至没有~/.gnupg/gpg-agent.conf 文件)。

编辑:似乎只要没有DISPLAY 可用,例如在没有 X11 转发的 SSH 会话中。但是当我在桌面上并且设置了DISPLAY 时,它仍然会弹出GUI 对话框。 unset DISPLAY (BASH) 在这种情况下使它使用诅咒而不是 GUI。

【讨论】:

如果安装了 pinentry,它就像一个魅力。命令可以更短:export GPG_TTY=$(tty) ;)【参考方案6】:

在较新版本的 gpg,>= 2.x 中,您可以使用它

stty -echo; gpg --passphrase-fd 0 --pinentry-mode loopback --decrypt filename; stty echo

stty 确保您的密码在您输入时不会被回显。 如果您只想快速打开 SSH 进入的桌面工作站,这比摆弄配置要顺畅一点。

不过,您将需要 pinentry sudo apt install pinentry-curses 或可能是 sudo apt install pinentry

这与 gpg 1.x 的旧时代相去甚远,您只需要 --no-use-agent

【讨论】:

就我而言,仅指定--pinentry-mode loopback 就足够了,不需要stty。在 Arch Linux 上的 gpg 2.2.20 下测试。 GPG 2.2.27: pinentry 不需要此配方 @ynn stty 不是必需的,它只会让您的密码在屏幕上不可见【参考方案7】:

如果您在 MacOS 上并使用 pinentry,您可以转到 ? > System Preferences > GPG Suite,然后将两者都禁用

Store in macOS keychain

Remember for ### seconds

然后点击Delete stored OpenPGP passwords 按钮。

删除 OpenPGP 密码部分非常重要,因为如果您的密码已经存储在钥匙串中,禁用其他 2 个选项是不够的!

我尝试了此线程中提到的大多数其他内容,包括将export GPG_TTY=$(tty) 添加到~/.bash_profile,使用gpg --no-use-agent(收到已弃用的消息,但仍然无效),查看~/.gnupg/gpg-agent.conf 和@987654332 @ 文件(两者都没有任何看起来会改变任何东西的东西),在我这样做之前,没有任何东西真正让 CLI pinentry GUI 提示输入密码。

希望这可以帮助将来遇到此问题的任何人!在我更新 gpg 并意外启用这些选项之后,我花了几个月的时间才弄清楚如何将它们恢复回来。

澄清一下,如果您希望 pinentry 在您想要使用 PGP 密钥进行验证的任何时候提示您输入密码,请确保您没有启用记住密码的选项并确保删除所有可能存储在 macOS 钥匙串中的 PGP 密码。

编辑:在 Ask Different 上找到了类似的答案:How to use GUI pinentry program for GPG

【讨论】:

【参考方案8】:

我的要求是通过 SSH 连接在远程服务器中创建密钥。

我的要求不在于编写所有内容

没有人提到这种方法。但它对我有用,并且满足我的要求:

    在 X11 (UI) 可用的机器中创建密钥
gpg2 --gen-key

...output omitted...
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) Enter
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) Enter
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: Abd Tm
Email address: abd@example.com
Comment: Enter
You selected this USER-ID:
    "Abd Tm <abd@example.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
    导出密钥:
# export private key
gpg2 --export-secret-keys --armor --output myfile abd@example.com

# export public key (same command above except --export arg)
gpg2 --export --armor --output myfile.pub abd@example.com

    将 2 个文件复制到我真正要安装密钥的服务器:
scp myfile* user@remote-server:/home/user
    SSH 到远程服务器并导入密钥
ssh user@remote-server

[user@remote-server] $ gpg2 --import /home/user/myfile
[user@remote-server] $ gpg2 --import /home/user/myfile.pub

    验证它是否有效:
[user@remote-server] $ gpg2 --list-keys

感谢this article

【讨论】:

以上是关于如何在 CLI 上使 gpg 提示输入密码的主要内容,如果未能解决你的问题,请参考以下文章

禁止 GPG 命令中的密码提示

如何在 Python 中在终端密码提示中输入密码

对于使用 WSL2 进行签名的 git 提交,Windows 10 上的 Visual Studio Code 中没有 GPG 密码提示

在密码提示符中输入行[重复]

亚信防火墙管理地址界面进不去

gpg: gpg-agent 在此次会话中无法使用