![如何像 ssh-agent+ssh-add 一样使用 gpg-agent?](https://linux22.com/image/1035378/%E5%A6%82%E4%BD%95%E5%83%8F%20ssh-agent%2Bssh-add%20%E4%B8%80%E6%A0%B7%E4%BD%BF%E7%94%A8%20gpg-agent%EF%BC%9F.png)
ssh-agent
非常容易使用,我启动它并使用 添加密钥ssh-add keyfile
。终止进程后ssh-agent
,所有文件都消失了。
我如何才能获得相同的行为gpg-agent
?我找到的最接近的程序是gpg-preset-passphrase
.但看看手册页gpg-agent
,看上去好像是创建了一个目录,用于存放私钥。
我可能错了,所以我想知道如何设置gpg-agent
不创建任何文件/目录?如果不可能,其他gpg-agent
像ssh-agent
+这样的建议ssh-add
也欢迎。我不是在寻找像 Seahorse 这样的 GUI 解决方案。
答案1
我决定再看看这个,并找出它的工作原理。GPG 使用术语“缓存”来存储密码。可以对最大存储时间施加两个限制:
- 自最初添加密钥以来保留密码的时间。
- 自上次访问以来保留密码的时间。
此外,这两个约束都存在两种变体,一种用于 GPG 密钥,一种用于 SSH 密钥(如果启用了支持)。
相关手册页条目来自gpg-agent(1)
:
--default-cache-ttl n
Set the time a cache entry is valid to n seconds. The default
is 600 seconds.
--default-cache-ttl-ssh n
Set the time a cache entry used for SSH keys is valid to n sec‐
onds. The default is 1800 seconds.
--max-cache-ttl n
Set the maximum time a cache entry is valid to n seconds. After
this time a cache entry will be expired even if it has been
accessed recently. The default is 2 hours (7200 seconds).
--max-cache-ttl-ssh n
Set the maximum time a cache entry used for SSH keys is valid to
n seconds. After this time a cache entry will be expired even
if it has been accessed recently. The default is 2 hours (7200
seconds).
密码始终会被缓存(在内存中,而不是在磁盘上!已使用 git repo 验证$HOME
),因此无需明确使用ssh-add
。例如,签署虚拟数据已触发缓存:
$ echo | gpg -s >/dev/null
(passphrase requested
$ echo | gpg -s >/dev/null
(signing proceeds without asking for passphrase)
要对 gpg-agent 的缓存设置进行永久更改,请编辑 ~/.gnupg/gpg-agent.conf` 并添加以下内容:
default-cache-ttl 60 # Expire GPG keys when unused for 1 minute
max-cache-ttl 600 # Expire GPG keys after 10 minutes since addition
我曾尝试通过指定 来启用 SSH 代理支持enable-ssh-support
,但这会使 gpg-agent 要求您提供另一个密钥来加密密钥,然后将您的私钥存储在 中~/.gnupg/private-keys.d/
。对我来说不行,那么我将坚持使用双 ssh-agent / gpg-agent 方法。
一些额外提示:
max-cache-ttl-ssh
在添加密钥时可以指定SSH 代理的等效项,例如:ssh-add -t 600 ~/.ssh/id_rsa
要防止将 GPG 密码存储在代理中,请禁用代理。在较新的 GPG 版本中,此选项
--no-use-agent
将被忽略,但您可以通过清除相关环境变量来阻止使用该代理。以下是一些方法:echo | GPG_AGENT_INFO= gpg -s # temporary export GPG_AGENT_INFO=; echo | gpg -s # until the current shell is closed