语境
我想使用 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
# ~/.gnupg/gpg-agent.conf
pinentry-program /usr/sbin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
# ~/.gnupg/gpg.conf
use-agent
# ~/.gnupg/sshcontrol
MYFINGERPRINTS
# ~/.ssh/config
Host localhost
ForwardAgent yes
AddKeysToAgent ask
我尝试过的链接
- gpg2 pinentry 在没有 X 的情况下失败
- SSH、tmux 和 GnuPG 代理的最佳实践
- Pinentry 使用 gpg-agent 和 SSH 失败
- https://wiki.archlinux.org/index.php/GnuPG#SSH_agent
- https://gist.github.com/andrewlkho/7373190
- https://www.linode.com/docs/security/authentication/gpg-key-for-ssh-authentication/
- https://opensource.com/article/19/4/gpg-subkeys-ssh
更新:工作配置(再次感谢@SystematicFrank)
# ~/.zshrc
export GPG_TTY=$(tty)
# ~/.gnupg/gpg-agent.conf
pinentry-program /usr/bin/pinentry-curses
default-cache-ttl 600
max-cache-ttl 7200
enable-ssh-support
# ~/.gnupg/gpg.conf
use-agent
# ~/.gnupg/sshcontrol
MYFINGERPRINTS
# ~/.ssh/config
Host localhost
ForwardAgent yes
AddKeysToAgent ask
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
答案1
gpg-connect-agent updatestartuptty
问题是每次打开终端时都会调用,因此 pinentry 将自身指向最新的 shell。
您真正想要的不是最新的 shell 终端,而是您正在连接的终端(调用 ssh 时)
为此,最简单的方法是告诉 .ssh/config 从您正在连接的 tty 执行更新命令。这是你所缺少的魔法线:
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"