結局gpg-agentを使うのに必要だったこと
前提
- sshにgpg-agentの組み込み対応があるわけではないので、 RemoteForwardオプションを利用してソケットをバインドして、リモートとローカルのgpg-agentが通信する。
- RemoteForwardオプションは- RemoteForward <remote socket> <local socket>で指定する。- デフォルトでは黙って失敗するので、 ExitOnForwardFailure Yesでとりあえず気づける。ただし、 失敗するときは、下記の通り、大抵すでに<remote socket>がすでに存在するからだと思うので、事前に消しておくスクリプトを用意した方が良さそう。
 
- デフォルトでは黙って失敗するので、 
- RemoteForwardはリモート先でexitしたからといって、リモート側のファイルが消えるわけではないので、そのままだと次回は失敗する。
- リモート側のソケットは、リモート側での gpgconf --list-dirs agent-socketの結果を利用する。
- ローカル側のソケットは、ローカル側の gpgconf --list-dirs agent-extra-socketの結果を利用する
- gpg-connect-agent <command> /byeという形式。- gpg-connect-agent help /byeで一覧。なんだこの構文。manpageにも書いてないし。
- RELOADAGENT コマンドで ~/.gnupg/gpg-agent.confの変更を適用する。- gpgconf --kill gpg-agentしてからもう一度立ち上げるのとほぼ同等だと思う
 
- UPDATESTARTUPTTY コマンドで GPG_TTY 環境変数のもとで gpg-agent を起動する。- LANG=Cした方が良さそうな雰囲気を醸している例があったが詳細な変化までは知らず。
 
 
- リモートで利用するには、事前に鍵の情報のimportが必要(秘密鍵という意味ではなく)- gpg --export <key id> | ssh host gpg --import -のように行えば良い。
- その後、 ssh host gpg --edit-key <key id>で trust —> save しておく。
 
- 上手く動いているかは、鍵をリモート先で利用してみて確かめる。- gpg --sign -u <key id> -a some.txt
 
gpg-agent.conf
SSH agentの役割もやってもらうなら、 enable-ssh-support を指定する。
これが結構混乱ポイントなのだが、SSH agent自体はsshによるビルトインのサポートがある。こちらの通信は上記で手動で繋いだものではなく、 SSH_AUTH_SOCK 環境変数に指定された方法で行われる。GPGのSSH agent機能を利用するには、ここに gpgconf --list-dirs agent-ssh-socket の結果を入れる必要がある。
正直、macを利用しているなら、mac標準のSSH agentの方が使いやすいと思うので、設定しなくても良いと思う。
また、macなら PIN Entry は pinentry-mac を設定した方が良いと思う。
自分のスクリプト
んで、便利なスクリプトはないのか、という話ですが、基本的に自分で作った方が良いです。
何をやっているかわからないスクリプトを、こういった信頼が重要な場面で使うことは本末転倒なところがあります。
ですが、一応参考のため貼っておきます。
dotfiles/fish/functions/gpg_agent_start.fish at master · LumaKernel/dotfiles
⭐ My own world. Contribute to LumaKernel/dotfiles development by creating an account on GitHub.
dotfiles/fish/functions/gpg_agent_ssh.fish at master · LumaKernel/dotfiles
⭐ My own world. Contribute to LumaKernel/dotfiles development by creating an account on GitHub.
dotfiles/fish/functions/gpg_agent_trust.fish at master · LumaKernel/dotfiles
⭐ My own world. Contribute to LumaKernel/dotfiles development by creating an account on GitHub.