背景
git commit時のGPG署名に失敗した。
以前からGPG署名のパスフレーズを毎回入力していたが、ある時点からpinentry-cursesによる入力ができなくなり、署名が失敗するようになった。
git commit時のGPG署名に失敗した。
以前からGPG署名のパスフレーズを毎回入力していたが、ある時点からpinentry-cursesによる入力ができなくなり、署名が失敗するようになった。
commit.gpgsign = truegit commitを実行すると、以下のエラーが発生しコミットできない。
gpg: signing failed: No such file or directory
fatal: failed to write commit objectこのとき、パスフレーズ入力ダイアログは表示されなかった。
GPG署名の流れは以下の通りである。
git commitがGPGに署名を要求するgpg-agentを呼び出すgpg-agentがパスフレーズ入力のためにpinentryを起動するpinentryが入力ダイアログを表示できないと署名に失敗する今回の原因は2つある。
pinentry-cursesを使用していたが、ターミナル環境によってはパスフレーズ入力ダイアログを正しく表示できない場合がある~/.gnupg/gpg-agent.confが存在せず、使用するpinentry-programを明示していなかったため、macOS向けのGUI pinentryに切り替わっていなかった# macOS向けのpinentryをインストール
brew install pinentry-macmacOSネイティブのGUIダイアログでパスフレーズを入力でき、Keychainへの保存にも対応する。
~/.gnupg/gpg-agent.conf を以下の内容で作成した。
pinentry-program /opt/homebrew/bin/pinentry-mac
default-cache-ttl 34560000
max-cache-ttl 34560000
pinentry-program: pinentry-macを使用することで、GUIダイアログとKeychain連携を利用できるdefault-cache-ttl: パスフレーズのキャッシュ保持時間であるmax-cache-ttl: キャッシュの最大保持時間であるgpg-agent.confはgpg-agentの標準設定ファイルであり、利用するpinentryプログラムをここで指定できる。
# gpg-agentを停止
gpgconf --kill gpg-agent
# gpg-agentを再起動
gpgconf --launch gpg-agent設定反映後、初回のgit commit時にGUIダイアログが表示される。「Save in Keychain」にチェックを入れて保存すれば、以降はパスフレーズの入力が不要になる。
# 署名のテスト
echo "test" | gpg --clearsign上記コマンドで署名済みテキストが出力されれば、GPG署名は正常に動作している。
gpg-agent.confを変更した場合は、毎回gpg-agentを再起動して設定を反映した方がよい。
また、pinentry-cursesのようなTTY依存のpinentryを使う場合は、シェルの設定ファイルに以下を追加しておくとTTYの不整合を避けやすい。
# ~/.zshrc または ~/.bashrc に追加
export GPG_TTY=$(tty)今回のようにmacOSでGUIダイアログを使う場合でも、ターミナル切り替え時のトラブルシューティングとして覚えておくと役立つ。