Ssh

gpg、ssh 和 gpg-agent 在多會話 tmux 環境中使用 GPG auth 子密鑰進行 SSH 和 pinentry 的正確配置是什麼?

  • October 3, 2020

語境

我想使用 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

我試過的連結

更新:工作配置(再次感謝@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"

問題是您gpg-connect-agent updatestartuptty每次打開終端時都在呼叫,因此 pinentry 將自己指向最新的 shell。

您真正想要的不是最新的 shell 終端,而是您要連接的終端(呼叫 ssh 時)

為此,最簡單的方法是告訴 .ssh/config 從您正在連接的 tty 執行更新命令。這是您缺少的魔術線:

Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"

引用自:https://unix.stackexchange.com/questions/554153