在 2.1.15 中使用 gpg-preset-passphrase 缓存通过 pinentry 输入的密码需要执行哪些步骤?

在 2.1.15 中使用 gpg-preset-passphrase 缓存通过 pinentry 输入的密码需要执行哪些步骤?

我正在寻求缓存密码以在无人值守的计算机上使用。由于这样做会带来一些风险,因此我更愿意选择缓存哪些密码短语,并避免将 和 都设置default-cache-ttlmax-cache-ttl令人讨厌的高值,并避免需要gpg-agent定期清除整个缓存 - 因此我正在寻找一种解决方案gpg-preset-passphrase。我在故障排除时发现的一些信息涉及旧版本的 GnuPG,因此我不确定我是否充分考虑了所有差异。

首先,按照 的规定man 1 gpg-agent,我export GPG_TTY=$(tty)在 .bashrc 中有。

现在假设我运行eval $(gpg-agent --daemon --allow-preset-passphrase --default-cache-ttl 1 --max-cache-ttl 31536000)启动 gpg-agent,注意到gpg-preset-passphrase 仍然遵循 --max-cache-ttl(默认 2 小时)。

$KEYGRIP然后,我使用 获取所需秘密子密钥的keygrip gpg --with-keygrip -K

我就这样尝试/path/to/gpg-preset-passphrase -c $KEYGRIP。按回车键后,将打印:

   gpg-preset-passphrase: caching passphrase failed: Not implemented

再次尝试添加--verbose --debug 6 --log-file /path/to/gpg-agent.loggpg-agent,我的日志附加了

   gpg-agent[4206] listening on socket /run/user/1000/gnupg/S.gpg-agent
   gpg-agent[4207] gpg-agent (GnuPG) 2.1.15 started
   gpg-agent[4207] handler 0x7f86ef783700 for fd 5 started
   gpg-agent[4207] command PRESET_PASSPHRASE failed: Not implemented
   gpg-agent[4207] handler 0x7f86ef783700 for fd 5 terminated

除了深入研究源代码之外,我不确定从哪里开始,所以我想知道是否有人可以首先纠正我正在采取的步骤。

答案1

听起来您想通过标准输入gpg-preset-passphrase发送密码,没有回显它(以避免将其暴露在进程列表中):

/path/to/gpg-preset-passphrase -c $KEYGRIP <<< $PASSPHRASE

如果您关心 bash 之外的可移植性:

/path/to/gpg-preset-passphrase -c $KEYGRIP <<EOF
$PASSPHRASE
EOF

这个关于“Here Documents”语法(EOF)的答案对我来说非常宝贵:https://unix.stackexchange.com/a/88492

你还需要像霍尔姆斯提到的那样allow-preset-passphrase~/.gnupg/gpg-agent.conf

如果您想使用对称加密来做到这一点(因为我已经对此失去了理智,也许您不必这样做),请参阅我的答案,找到正确的 keygrip/cacheid 用于在 gpg- 中预设密码代理人:https://superuser.com/a/1485486/1093343

答案2

我也遇到了这个问题,我已经通过向 gpg-agent 添加配置解决了,你可以在这里找到它:

https://stackoverflow.com/questions/49491679/how-to-enter-gnupg-agent-key-passhprase-from-cli

相关内容