GPG 鍵を SSH に使う
まず SSH にも使える設定を入れる。
code:shell
echo enable-ssh-support >> ~/.gnupg/gpg-agent.conf
とりあずちょっと使ってみる。
code:shell
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
gpgconf --launch gpg-agent
はい、これで有効化されました、と。
さらには 'export GPG_TTY=$(tty) も設定している例もある。
公開鍵を GitHub なりに登録するにはこの状態で ssh-add -L で公開鍵の中身を確認すする(なお ssh-copy-id なるコマンドでコピーすることもできるようだ)。
このとき、鍵を YubiKey などのスマートカードに保存しているとコメントが
code:txt
ssh-ed25519 ..... cardno:01 234 567
のように cardno:<num> のようになるので、個人用サーバなら明白で良いかもしれないが、共有の踏み台サーバみたいなものに置いた場合に分かりにくい。
https://wiki.archlinux.org/title/GnuPG#Using_a_PGP_key_for_SSH_authentication によれば openpgp:<key-id> という名称が良いようなので手でこの部分を書き換えた上で ~/.ssh/smartcard.pub 等として保存しておくと便利だ。それをサーバや GitHub などに登録する。
またこの場合、~/.ssh/config の設定で IdentityFile に ~/.ssh/smartcard.pub を設定することで、この鍵を使った SSH を予め指定しておくことができる。
さて問題は SSH_AUTH_SOCK の設定などをどこで行うかだ。
GUI に限定するならば ~/.xprofile でいいだろうが、まあ shell の設定に入れてしまうこともできる。
そして gpg-agent の起動の方は $HOME/.config 配下の systemd 設定の方に持ってくるとか。
…などと考えていたが、とりあえず .xprofile とshell の設定ファイルの両方に書くことにした。rofi から起動した GUI アプリケーションにこの環境変数を渡さなければならない(IntellJ の GitHub 連携)ためと、念の為 CUI でも有効化しておくかというのがあり。ただし同じ定義を二箇所に書くのはイケてないので、他の手段を考えたいところだ。
他のマシンからも同じ鍵を使うには
当然ながら GPG 公開鍵の export と import が必要である。
code:shell
# 上記設定をしたマシンにて
$ gpg --armor --export $KEYID > public.gpg
# 別のマシンにて: 上記ファイルを共有した上で
$ gpg --import /path/to/public.gpg
あとは ~/.gnupg/gpg-agent.conf などの一連の上記設定をやればよい。
トラブルシューティング
なんかエラーになるぞ、という場合は gpg-agent が設定を読めてない可能性がある。sign_and_send_pubkey: signing failed: agent refused operation みたいなエラーが出たりする。以下で読み込み直す。おそらくYubiKey を刺した状態でやる必要があるんじゃないだろうか。
code:shell
$ gpg-connect-agent killagent /bye
$ gpg-connect-agent updatestartuptty /bye
アンロックができなくなった
code:text
Number: XXXX XXXXXXXX
Holder:
Counte: 276
Remaining attempts: 0
PIN _____________
この辺が怪しい気がする。
code:shell
$ gpg --card-status
<snipped>
PIN retry counter : 0 0 3
Signature counter : 276
安直なのは一度リセットすることだ。
https://support.yubico.com/hc/en-us/articles/360013761339-Resetting-the-OpenPGP-Application-on-the-YubiKey
code:shell
sudo pacman -S yubikey-manager
ykman openpgp reset
そして鍵の再インストール
YubiKey に GPG 鍵を入れる
PIN の入力がまともにできない
CLI 版だとこういうことが起きる模様。
PIN の入力 UI が出てこなくて git pull しようとしたらそのまま PIN 入力待ちでブロックされてしまったりとか、CLI から入れようとしてもカーソルの位置がなんかおかしくて入力できないとか。
以下で GUI 版を使うように強制できる。
code:shell
echo 'pinentry-program /usr/bin/pinentry-qt' >> ~/.gnupg/gpg-agent.conf
設定したあとはもしかしたら gpg-agent を一度 kill して再起動する必要があるかも。
Qt 以外にも GTK 版とかもあるので、その辺は /usr/bin/pinentry-* の中から好きなものを選べばいい。
#Linux #YubiKey