Project Paper A4 5mm

清書したメモが置かれる

Git commit時にGPG署名に失敗する

概要

GPG署名に失敗する。

今回の解決策は、このIssueに書いてる通り、export GPG_TTY=$(tty)(fish使いはset -Ux GPG_TTY (tty))を実行すること。

無事、コミットにVerifiedの文字を輝かせることができた。

署名に失敗する

コミットにVerifiedを付けたいのでGPG署名をしようと思った。 鍵発行、登録、ローカル設定を順調に終え、さあコミットだ!という段階で以下のエラー

$ git commit -m "First commit" -S
error: gpg failed to sign the data
fatal: failed to write commit object

GPGのtestをしよう

ググるgpg-agentがないとか言われたがそんなことはなかった。pinentryもあるし(そもそもないと鍵作成できないのでは)、gpgが古いのか……?など色々調べていったときに以下のサイトにぶち当たった。

For troubleshooting, see this answer (though that is about linux not brew), it suggests a good test:
echo "test" | gpg --clearsign
github - gpg failed to sign the data fatal: failed to write commit object [Git 2.10.0] - Stack Overflow

で、結果は

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

test
gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device

あーやっぱり失敗するんですね……(バージョン古いとかかな~と思った)

解決へ

signing failed: Inappropriate ioctl for deviceで検索してようやく解決に至った。その方法が以下のexport実行

Since this is a fatal error and also quite difficult to debug, maybe the fix could be put somewhere (in the provided command line?):
export GPG_TTY=$(tty)
gpg: signing failed: Inappropriate ioctl for device · Issue #2798 · keybase/keybase-issues

僕はfisher(この呼称は正しいか?)なのでゴキゲンにset -Ux GPG_TTY (tty)(追記: echo 'set -x GPG_TTY (tty)' >> $__fish_config_dir/conf.d/gpg.fish1)を叩いた。bash, zshの人は上記引用コマンドを打てばいいと思う。

export後にecho "test" | gpg --clearsignすると、

┌────────────────────────────────────────────────────────────────┐
│ Please enter the passphrase to unlock the OpenPGP secret key:  │
│ "John Doe <johndoe@nanashi.local>"                             │
│ 4096-bit RSA key, ID XXXXXXXXXXXXXXXX,                         │
│ created 2020-02-22.                                            │
│                                                                │
│                                                                │
│ Passphrase: __________________________________________________ │
│                                                                │
│         <OK>                                    <Cancel>       │
└────────────────────────────────────────────────────────────────┘

パスフレーズを間違えないように打って認証成功。無事にコミットもできた。

後日談

いや当日談なんだが

コミットもできたしプッシュして早速Verifiedを見に行ったら

f:id:konafx:20200222180714p:plain

原因はかんたんで、公開鍵のコピペをミスってた。Hyper.jsというターミナルソフトを使っているのだが、(おそらく設定不足で)コピペが微妙におかしい時がある。

今回は-----BEGIN PGP PUBLIC KEY BLOCK-----の次の行に鍵本文(?)が貼り付けられていた。ちまちま直してUpload成功させたあとにようやく

f:id:konafx:20200222181039p:plain


  1. Terminalソフトを(よっぽど稀だが)変えるとおそらく確実に、また、ターミナルを開き直してGPGの認証をするときは稀に「GPG認証が立ち上がらない」「パスワードが隠れない」「うまく打てない(pinentryの不調のような動作)」のような現象が起きる。このとき、$GPG_TTYttyの値が異なっていた。ターミナルを開くたびに変わるのであればターミナルを開くたび(=ログインするたび)にttyの更新値に合わせて$GPG_TTYを設定するように変更した。