OpenPGPの鍵でOpenSSHと接続する(GnuPG2利用)

Pocket

OpenPGPの鍵は、GnuPG2に付属のgpg-agantと組み合わせると、sshの鍵としても利用が可能です。しかし、これに関する日本語の情報がどうもなさそうなので、ちょっとまとめてみます。GnuPG 2.0系を対象とします。2.1系はもっと扱いが楽そうなのですが、そちらはまだ開発版なので使っていません。

まず、自分自身のOpenPGPの鍵を用意します。普段からGnuPGを使っているなら、その鍵を利用できます。ない場合は新規に作成しましょう。もちろん、すでにGnuPG 2.0がインストールされていることが前提です。また、.gnupg/gpg.confにuse-agentを追加しておきましょう。

次に、monkeysphereをインストールします。Debian stableならパッケージがあるのでaptで入れましょう。そして、ssh用のsubkeyを次のコマンドで生成します。

# 鍵長2048bitのRSA鍵を生成

$ monkeysphere gen-subkey -l 2048

subkeyの生成には時間とエントロピーが必要です。バックグラウンドで何か複雑な処理やdisk IOなどを発生させましょう。私の場合は、2GBぐらいのVorbis/Theoraファイルを適当にgrepさせていました。

今度はgpg-agentを起動します。gpg-agentはGnuPG2の一部ですが、Debianだとgpg-agentパッケージとして分離されていますので、これもaptで入れましょう。また、pinentryという、途中でパスフレーズを入力させるためのプログラムも必要です。tty向けのpinentry-curses, gtk2向けのpinentry-gtk2, qt/4向けのpinentry-qt/qt4パッケージがあります。環境に合わせて必要な方をいれましょう。

gpg-agentの引数は設定ファイル~/.gnupg/gpg-agent.confに書くことができます。以下は設定例です。

pinentry-program /usr/bin/pinentry-curses
no-grab
default-cache-ttl 180
allow-mark-trusted
write-env-file /home/user/.gnupg/gpg-agent-info
enable-ssh-support

1行目はpinentry用のプログラムの指定です。環境に合わせて適切なものを選んでください。5行目は、GnuPG2が参照するための環境変数をファイルにも出力させるための設定です。6行目の設定は必須で、これを指定することでgpg-agentがssh-agentと同じ機能を提供してくれます。

ここまで設定したら、以下のコマンドを実行します(bash, zshの場合)。

$ eval `gpg-agent –daemon`

これでgpg-agentがdaemonとして起動します。次に鍵の登録をします。これは普通にssh-addを実行すればよいです。OpenSSHの鍵があれば、普通にそれについてのパスフレーズも聞いてきます。この段階でOpenPGPの鍵も登録されます。登録されていることは、ssh-add -lで確認できます。

$ ssh-add -l
2048 76:9a:97:aa:c6:9e:c1:c7:bc:a8:f6:fd:4b:10:d6:8b NOKUBI Takatsugu <knok@daionet.gr.jp> (RSA)
1024 31:b5:52:35:e0:70:0c:d6:yy:0f:65:f7:87:5b:a6:1a /home/knok/.ssh/id_dsa (DSA)

ハイライトされた部分がGnuPGの鍵です。パスフレーズは、必要になるときまで聞かれません。

ssh-add -Lを実行して、公開鍵を確認しましょう。

$ ssh-add -L
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC20e1bGCIzY+wi1UqIKWNGQ0pLRPgVGWtDJ2xyJ/sjHuzqr5r+JRd2bV5wRQ1uxGTSH5eJe1xYoPRThHLr6fos7vcGtXeTqBiu0qXKJ0EF4z6Q/yRNo6uXUUEdYoPPQHQYo7MtP8XFWp3CRAhhHAzAJZqsimqdwABaG+9wcM/OrJR6+oi42U0grZJcgw5glHXTLLX/3N7ZTXt2GK7Ddy/Pwsi7pSHRkpNnOfOy5KpFjQfEcru5Vx0rRg5yJS2IBBFNSiw6gPTFPwwUPBvS7Ih91p778hrKE3NcnZfW6CRk4Li9lzz61bJ8LXFklgo9O9Nm/IP3ZkG2LMxxxxxxxxxx NOKUBI Takatsugu <knok@daionet.gr.jp>
ssh-dss AAAAB3NzaC1kc3MAAACBAOIawGsPMDZ1XLIYk0YQFWtYUEc62UQsuSFJN+fHovSpjP8MPOY9Shsd20YbtiQpPT/M5DCT2ptI2kghJMokcoClsnWOqimuLxtl0RZMc5OgK6HpQmgjYf9iwr7n/N30FYt5iwHx2cRU/dH06nLQOfZpJnlOKH7Gltggul9g6Jt5AAAAFQC7UI2OtSFlQjnEJjbFxi8XDk5m3QAAAIAXo9X9NvBtueAxTvao/9CTneyd44waOgRAsMaiCqj/oc0S20Ldzlw25jJrQDMACkIvExsQ6U4sHFIAtrUb20PHeh03oQjMnT7YzTunudNKA62/FXC1oG5aZ7CXCm/cp5aSP+++EAkF3dSCr4Awl9GnakWTXNPQypYNIDZ5viXNAAAAAIEAhV/2sR9KbrnwXcMK+Dxu44zSuTLEjlnuJtorl0IFlnV64HzgUtMaM48kLcwfjPmGTuN8chcOcF05aF/1B11dCBwEONdJp/WyBJeLvUE4PWv61IAQZ7su/7J4U3MN/4MLheo4iUmpvFgq5qfxrmkhvtsV0ovCHqc/Icxxxxxxxxxx /home/knok/.ssh/id_dsa

コメント部分にOpenPGPのidが書かれているのが公開鍵です。これをリモートホストの.ssh/authorized_keysに追記します。

あとは対象のサイトにsshで接続すると、pinentryプログラムが起動し、パスフレーズを要求してきますので、入力してログインしましょう。

DebianのGNOME2環境では、デフォルトでgpg-agentとは異なるagentが走っています。Programmierecke.NET – The Source of Programming Informationを参考にgnome-keyringを止めてください。

参考サイト