memo

2012-08-27

gpg-agent を ssh-agent として使う

自分の理想の ssh-agent の動きは

  1. 事前に ssh-add しておかなくとも、実際に ssh コマンドが実行されたタイミングでパスフレーズの入力を求める

  2. 設定可能な一定時間が経過したら、再度パスフレーズの入力を求めるようになる

というもので、 openssh 付属の ssh-agent は 1. が満たせないし、 gnome-keyring は 2. ができない。

が、どうやら gpg-agent がこの動きをしてくれるようなので、使ってみることにする。

使い方

$ eval $(gpg-agent --sh --enable-ssh-support --daemon \
           --default-cache-ttl-ssh 3600 \
           --max-cache-ttl-ssh 10800 \
           --write-env-file ~/.gpg-agent-info)

gpg-agent--enable-ssh-support をつけて起動すると ssh-agent として振る舞うようになる。 キーがキャッシュされる時間は --default-cache-ttl-ssh, --max-cache-ttl-ssh で指定する。

gpg-agent に接続するために必要な環境変数が ~/.gpg-agent-info に書き込まれるので、 新しく shell を起動したときはこれを読み出す:

$ source ~/.gpg-agent-info
$ export GPG_AGENT_INFO
$ export SSH_AUTH_SOCK

ssh-agent protocol にはどのディスプレイ・端末にユーザーがいるのかを通知する仕組みがないので、 コマンド実行前に毎回 gpg-agent に教えてやるようにする:

# zsh 限定。他の shell での方法は分からん。
preexec() {
  gpg-connect-agent updatestartuptty /bye > /dev/null
}

参考: https://wiki.archlinux.org/index.php/SSH_Keys#GnuPG_Agent