什么是 gpg、ssh 和 gpg-agent 在多会话 tmux 环境中将 GPG auth 子密钥用于 SSH 和 pinentry 的正确配置?

Cal*_*ian 3 ssh gpg ssh-agent gpg-agent

语境

我想使用 GPG 身份验证子密钥而不是 SSH 密钥。

我还想gpg-agent用来管理这些密钥的密码缓存。

我在无头环境中运行,所以我想pinentry-curses用于我的密码输入程序,但我对在无头环境中工作的任何东西都很好。

我的开发工作流程是这样的,我在多个tmux会话和窗格中工作,并且需要能够git push从其中任何一个中工作。

问题

当我尝试这样做时会出现问题。它不是pinentry在我当前的窗格中弹出,而是在随机的其他窗格中弹出(或者有时可能根本没有窗格,但可能有太多要搜索的窗格)。为了解决这个问题,我需要杀死那个窗格pinentry-curses,即使这样它有时仍然会失败。

我试过的

我试过的配置

我当前的配置如下,尽管在过去的几周里我尝试了很多尝试让它工作。

# ~/.zshrc

unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
  export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi

if [[ $SSH_AUTH_SOCK == /tmp/* ]]; then
    ln -sf $SSH_AUTH_SOCK $HOME/.ssh-agent-sock
    export SSH_AUTH_SOCK=$HOME/.ssh-agent-sock
fi

export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >/dev/null
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/gpg-agent.conf

pinentry-program /usr/sbin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/gpg.conf

use-agent
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/sshcontrol

MYFINGERPRINTS
Run Code Online (Sandbox Code Playgroud)
# ~/.ssh/config

Host localhost
ForwardAgent yes
AddKeysToAgent ask
Run Code Online (Sandbox Code Playgroud)

我试过的链接

更新:工作配置(再次感谢@SystematicFrank)

# ~/.zshrc

export GPG_TTY=$(tty)
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/gpg-agent.conf

pinentry-program /usr/bin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/gpg.conf

use-agent
Run Code Online (Sandbox Code Playgroud)
# ~/.gnupg/sshcontrol

MYFINGERPRINTS
Run Code Online (Sandbox Code Playgroud)
# ~/.ssh/config

Host localhost
ForwardAgent yes
AddKeysToAgent ask
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
Run Code Online (Sandbox Code Playgroud)

小智 8

问题是gpg-connect-agent updatestartuptty每次打开终端时都会调用,因此 pinentry 将自身指向最新的 shell。

您真正想要的不是最新的 shell 终端,而是您正在连接的终端(调用 ssh 时)

为此,最简单的方法是告诉 .ssh/config 从您正在连接的 tty 执行更新命令。这是您缺少的魔术线:

Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
Run Code Online (Sandbox Code Playgroud)