ぽぽんたの備忘録

Programming, My study, and so on.

ssh-agentからgpg-agentへの移行 | ぽぽんたの備忘録

ssh-agentからgpg-agentへの移行

October 16, 2023

基本的に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' \
...

sshgpgは適切そうな読込順のところに追記すること.
この環境ではgitの上くらいに追記した. また,zstyle ':prezto:module:ssh:load'の行はコメントアウトしておくこと.

最後に,~/.gnupg/sshcontrolGnuPGで作成した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

としたときに,今まで通り使用できることがわかる.