
コンテクスト
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
試してみたリンク
- 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 が最新のシェルを指すことです。
実際に必要なのは最新のシェルターミナルではなく、接続元のターミナル(sshを呼び出すとき)です。
最も簡単な方法は、接続している tty から update コマンドを実行するように .ssh/config に指示することです。これは、あなたが見逃している魔法の行です:
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"