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
としたときに,今まで通り使用できることがわかる.