我正在使用 arch linux 并使用 gpg (GnuPG) 2.2.27
我使用以下方式配置了 gpg
/home/vipin/.local/share/systemd/user/ 处的系统服务并使用激活套接字以启动 gpg-agent.service
gpg-agent-browser.socket
gpg-agent.socket
gpg-agent-extra.socket
gpg-agent-ssh.socket
gpg-agent.service
gpg-代理服务
[Unit]
Description=GnuPG cryptographic agent and passphrase cache
Documentation=man:gpg-agent(1)
Requires=gpg-agent.socket
[Service]
ExecStart=/usr/bin/gpg-agent --supervised --enable-ssh-support
ExecReload=/usr/bin/gpgconf --reload gpg-agent
gpg-agent.socket
[Unit]
Description=GnuPG cryptographic agent and passphrase cache
Documentation=man:gpg-agent(1)
[Socket]
ListenStream=%t/gnupg/S.gpg-agent
FileDescriptorName=std
SocketMode=0600
DirectoryMode=0700
[Install]
WantedBy=sockets.target
gpg-代理-ssh.socket
[Unit]
Description=GnuPG cryptographic agent (ssh-agent emulation)
Documentation=man:gpg-agent(1) man:ssh-add(1) man:ssh-agent(1) man:ssh(1)
[Socket]
ListenStream=%t/gnupg/S.gpg-agent.ssh
FileDescriptorName=ssh
Service=gpg-agent.service
SocketMode=0600
DirectoryMode=0700
[Install]
WantedBy=sockets.target
gpg-代理-额外套接字
[Unit]
Description=GnuPG cryptographic agent and passphrase cache (restricted)
Documentation=man:gpg-agent(1)
[Socket]
ListenStream=%t/gnupg/S.gpg-agent.extra
FileDescriptorName=extra
Service=gpg-agent.service
SocketMode=0600
DirectoryMode=0700
[Install]
WantedBy=sockets.target
gpg-代理-浏览器.socket
[Unit]
Description=GnuPG cryptographic agent and passphrase cache (access for web browsers)
Documentation=man:gpg-agent(1)
[Socket]
ListenStream=%t/gnupg/S.gpg-agent.browser
FileDescriptorName=browser
Service=gpg-agent.service
SocketMode=0600
DirectoryMode=0700
[Install]
WantedBy=sockets.target
当我执行 git push 时,所有事情都运行正常。我能够获得 gpg 提示符并能够输入密码。gpg-agent 因套接字激活而启动
vipin 31480 17517 1 01:09 ? 00:00:00 /usr/bin/gpg-agent --supervised --enable-ssh-support
但是当我尝试使用下面的命令使用 gpg 加密文件时
gpg --decrypt -q --pinentry-mode=loopback ${XDG_DATA_HOME}/pass/other/systembackup.gpg
数据正在解密,但是当我尝试执行 ps -eaf |grep gpg 时。我可以看到两个代理正在运行,一个在守护进程中,另一个在监督中。如何使此命令使用套接字激活?
vipin 32064 17517 0 01:11 ? 00:00:00 /usr/bin/gpg-agent --supervised --enable-ssh-support
vipin 32167 1 1 01:11 ? 00:00:00 gpg-agent --homedir /home/vipin/.local/share/gnupg --use-standard-socket --daemon
答案1
启动第二个实例是因为它服务于不同的 GNUPGHOME--homedir
,从其启动选项就可以看出。
(默认位置是~/.gnupg
,而您的启动位置是~/.local/share/gnupg
。)
不同的 gpg 目录将总是有单独的 gpg-agent 实例,否则将失去拥有单独目录的意义。(这是因为 gpg-agent 不再仅仅是一个密码缓存服务——从 v2.1.x 开始,它是处理全部访问子目录中的 gpg 私钥private-keys-v1.d
。)
为了避免这种情况,您需要为可能使用的每个不同的 GNUPGHOME 复制 gpg-agent.service(以及至少它的一些 .socket 单元),或者停止使用自定义的 GNUPGHOME。
(请注意,即使 GNUPGHOME 是定制的,最近的 GnuPG 版本也总是将套接字保存在 /run 中的随机路径中,而不再直接保存在“主”目录中;但是,该路径是确定性的,作为主目录位置的哈希值,可以使用 进行检索gpgconf --list-dirs
。)