ssh-agentからgpg-agentへの移行
基本的にSSH認証鍵をssh-agent
で管理していたのですが,PGP keyの管理と同様に,gpg-agent
で管理することもできるみたいだし,ssh-agent
よりもgpg-agent
の方がsecureらしい.
そこで,OpenSSHからOpenPGPへの移行を考えてみました.
環境は,WSL2のUbuntu20.04で,当然GnuPG
はインストール済みであることを前提とします.
シェルは,zsh
を使用しています.
GnuPGでの公開鍵の作成
もちろん,もう作成済であればこの手順は不要.
gpg --expert --full-generate-key
# いろいろ聞かれるから適した文字列を入力
# subkeyとしてauthentication keyを作成する
ssh-agentからgpg-agentへの移行
Ubuntuだと,ssh-agent
を使用する前提になっているらしいので,/etc/X11/Xsession.options
の記述を変更する.
use-ssh-agent
となっている部分をno-use-ssh-agent
に変更すると,以下のようになるはず.
# $Id: Xsession.options 189 2005-06-11 00:04:27Z branden $
#
# configuration options for /etc/X11/Xsession
# See Xsession.options(5) for an explanation of the available options.
allow-failsafe
allow-user-resources
allow-user-xsession
no-use-ssh-agent
use-session-dbus
ところで,gpg-agent
でpassphraseを入力するとき,pinentry
というプログラムが起動する.
このプログラムはCUIで動作するので,pinentry-qt
などのGUIで動作するものをインストールすると良い.
GUIを使うには,WSLgを有効にするか,自分で色々設定する必要があるので,そこは注意が必要.
sudo apt install pinentry-qt
また,~/.gnupg/gpg-agent.conf
に以下の記述を追加する(なかったら作成する).
pinentry-program /usr/bin/pinentry-qt
enable-ssh-support
default-cache-ttl 600
max-cache-ttl 7200
default-cache-ttl-ssh 600
max-cache-ttl-ssh 7200
pinentry-program
は,使いたいpinentry
のパスを指定する.
数値の部分は,適当に変更しても良い.(例はすべてデフォルト値のはず)
GUIのpinentry
を使用することで,VSCodeなどから色々やるときでも,passphraseを入力することができるので嬉しい.
そもそも,gpg-agent
を使用するには,gpg-agent
を起動しておく必要があるが,この環境ではzsh
のpluginを使用しているため,あまり意識していなかった.
prezto
を使用している場合,.zpreztorc
に以下の記述を追加する.
...
zstyle ':prezto:load' pmodule \
...
'ssh' \
'gpg' \
...
ssh
とgpg
は適切そうな読込順のところに追記すること.
この環境ではgit
の上くらいに追記した.
また,zstyle ':prezto:module:ssh:load'
の行はコメントアウトしておくこと.
最後に,~/.gnupg/sshcontrol
にGnuPG
で作成したAuthentication keyのkey gripを記述する.
gpg --with-keygrip --list-key
# 表示されたものの内,sub ... [A] となっているもののkey gripをコピーする
echo "YOUR_KEY_GRIP" > ~/.gnupg/sshcontrol
これで,gpg-agent
を使用して,ssh
での認証ができるようになる.
.ssh/config
をgpg-agentでも使いたい
使えます.
gpg --export-ssh-key YOUR_UID > ~/.ssh/id_ed25519.pub
のような感じで.ssh
内に公開鍵を登録し,~/.ssh/config
に以下の記述を追加する.
...
IdentityFile ~/.ssh/id_ed25519.pub
...
例えば,GitHubについての設定をするのであれば,以下のようになる.
Host github # 任意の名前
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519.pub
このようにすると
ssh -T github
としたときに,今まで通り使用できることがわかる.