Local Machineに接続されたPIV Smart Cardの署名鍵を利用して,Remote Machine上でのgit commit時に署名する方法を調べた.手がかり自体は検索で発見することができたし,手順自体はGPGのドキュメント通りに設定すれば問題なく動作した.
諸事情により1週間ほど自宅を離れなければならなくなった.
普段の仕事や趣味の開発も,基本的にはLinux(NixOS)がインストールされたHomebuild Computer(以下,Linux機)を使っており,特定のソフトウェア(e.g. Apple, Adobe, Microsoft製品等)を必要とするときや,仕事部屋以外で作業をするときはMacBook Pro(以下,mac)を使用している.
さて,私は電子署名にGPGを使用しているのだが,署名用のキーはYubiKey 5 NFCに保存してある.基本的にYubiKeyはLinux機に挿しっぱなしなので,一度PINを入力してgpg-agentに記憶させてしまえば,macからsshしている間もLinux上で署名に困ることはない.このYubiKeyは絶対になくさないように(一応,予備のYubiKeyも構成済みだが)物理キーチェーンに繋げてあるのだが,流石に今回は家を空けるので,Linux機から外さざるおえなくなった.なにせ,物理ーキーチェーンには当然ながら自宅の鍵も繋げてあるからだ.
Linux機からYubiKeyを抜いてしまうと,Linux機上でgit commitをする際署名ができなくて困る.
まぁ,どうせAgentのForwardなりを設定すれば,ローカルに接続されたスマートカードの鍵を使って,リモートサーバでも署名できるだろう.と考えていたし,最悪リモートで行った変更をscpなりrsyncなりでローカルに持ってきて署名すればいいや.と雑に考えていたので,不在にする自宅のLinux機にYubiKeyを置いてくることは考えなかった.
果たして,Agent Forwardでうまくいった.
SSH を使用したGPGのAgent Forwardを使って,以下の要求を満たせた.というだけの話である.
できないわけないと思っていたが,今までやっていなかった.
それっぽい検索をすると,秒で答えが出た.
StackExchangeは偉大である.
前述のStackExchangeの回答にある通り,GPGのAgent Forwardgingのページの通りにやればよい.
なお,私のgpgバージョンは以下の通りなので,gpgの設定にextra-socket
を追加する必要はなかった.
Local Machine(mac):
gpg (GnuPG) 2.3.7
libgcrypt 1.10.1
Remote Machine(Linux):
gpg (GnuPG) 2.3.6
libgcrypt 1.10.1
以下のようなエラーが出た.
connect to /Users/<user>/.gnupg/S.gpg-agent.extra port -2
gpg-agent.extra port -2 failed: Connection refused
該当のファイルは存在しており,設定上も問題なさそうに見える.
そもそも,今回gpg-agent側の設定は特におじっておらず,クライアント側で追加したのはsshの設定だけである.
検索してもこれといった手がかりは得られなかったのだが,Local Machine側のSocketにつながらないというのであれば,それを持っている**gpg-agentがおかしいのではないか?**と考え,再起動したらあっさり解決した.
gpgconf --kill gpg-agent
gpg-agent --daemon