コンテクスト

コンテクスト

コンテクスト

SSH キーの代わりに GPG 認証サブキーを使用したいと思います。

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"

答え1

問題は、gpg-connect-agent updatestartupttyターミナルを開くたびに呼び出しが行われるため、pinentry が最新のシェルを指すことです。

実際に必要なのは最新のシェルターミナルではなく、接続元のターミナル(sshを呼び出すとき)です。

最も簡単な方法は、接続している tty から update コマンドを実行するように .ssh/config に指示することです。これは、あなたが見逃している魔法の行です:

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

関連情報