結局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.