Gitコマンド入門::Gitカスタマイズ機能(config,GPG設定)第七十四回

5 min read読了の目安(約4700字

みなさんこんにちは! 今回は、前回の続きで、GPG設定を学習して行きますね。本線からは、ちょっと脱線してしまいますが、GPGの動作環境が整っていないと、パスフレーズ画面の入力でエラーとなり、処理が中断してしまいます。当然、これでは実際に署名ができませんので、今回は、GPG設定について補足しておきま~す! 環境設定でエラーにならない方は、この回はスキップしてもOKです!

今回は、こちらのドキュメントです!

https://git-scm.com/book/ja/v2/Git-のさまざまなツール-作業内容への署名#r_signing

タグへの署名 GPG 秘密鍵の設定を終えていれば、その鍵を使ってタグの作成時に署名できます。その場合は -a の代わりに -s を指定すればいいだけです。

環境設定に問題なければ、こちらのドキュメント通りですが、ちょっと調べてみると、Linuxや、MaxだとGPGの環境設定で苦労している記事も見かけます。実際に私も、環境設定で躓きましたよ~(^▽^;)

前回の記事はこちらから!

https://zenn.dev/shiozumi/articles/1c9434729c3b5d

git本家のドキュメントメニューはこちら!

https://git-scm.com/book/ja/v2

まずは、私の環境は、以下のようになっています!

  1. CentOS 7.x (Gitローカル環境)
  2. gpg (GnuPG) 2.0.22
  3. Tera Term 4.86 (Windows10から,sshでリモート接続)

私の環境では、パスフレーズ画面で2箇所のエラー発生

  1. gpg --gen-key で、パスフレーズ画面エラー
  2. git commit -S -m "1st" で、パスフレーズ画面エラー

補足事項
echo "test" | gpg --clearsign でも、2番のエラーを確認することが可能。

gpg --gen-key パスフレーズ画面エラー

前回にも記載しましたけど、パスフレーズの画面が起動せずに、そのまま、ユーザーによる取り消しとなって、処理が中断してしまう場合の対処方法です。

本名: Makoto Shiozumi
電子メール・アドレス: shiozumi@esmile-hd.com
コメント:
次のユーザIDを選択しました:
    "Makoto Shiozumi <shiozumi@esmile-hd.com>"

// ここまでは、無事に処理が進みますが、OKの選択後、
// パスフレーズ入力画面が起動しませんでした。

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
秘密鍵を保護するためにパスフレーズがいります。

gpg: ユーザによる取消し
gpg: 鍵の生成が取り消されました。

// ↑↑↑ エラーを出力して処理が中断されます!(^▽^;)

ユーザによる取消し、鍵の生成が取り消されました。・・・とエラーを吐いて、処理が中断されてしまいます。

正常に動作した場合、パスフレーズ入力画面が起動!

正常に処理されると、こちらのパスフレーズ画面が起動して、入力を求められます。Googleで検索してみると、パスフレーズ画面が表示されないケースは、Mac環境やその他でのトラブルも多そうでした。

原因は、他のアカウントでログインすると発生!

こちらの原因は、いたってシンプルで、Tera Termでログインするとき、私は、root アカウントでログインしたあと、su - UserName で、ユーザーアカウントを切り替えたのが原因です。従って最初から、ローカルユーザーアカウントでログインすれば、エラーにはなりません。

git commit -S -m "1st" パスフレーズ画面エラー

署名付きでコミットしたときに、以下のようなエラーが出力されます!

$ git commit -S -m "1st"

error: gpg failed to sign the data
fatal: failed to write commit object

// ↑↑↑ エラーを出力して処理が中断されます!(^▽^;)

git init して環境設定していなくても、echo "test" | gpg --clearsign のコマンドで同じエラーを確認できます。

echo "test" | gpg --clearsign エラー確認可能!

$ echo "test" | gpg --clearsign

次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"Test Shiozumi <test@esmile-hd.com>"
2048ビットRSA鍵, ID 9970DB65作成日付は2021-04-08

gpg: ユーザによる取消し
gpg: no default secret key: 操作がキャンセルされました
gpg: [stdin]: clearsign failed: 操作がキャンセルされました

エラー回避方法、GPG_TTY 環境変数の設定

// まずは、標準出力先の確認、最後の数字2は、随時変化します!
$ echo $(tty)
/dev/pts/2

// GPG_TTY変数に、標準出力先を設定
$ export GPG_TTY=$(tty)

// 設定確認
$ echo $GPG_TTY
/dev/pts/2

/dev/pts/2 出力デバイスは、Tera Termからログインする度に、毎回変わりますので、環境変数、$(tty) から取得して設定します。

export GPG_TTY=$(tty) で環境変数を設定すると、今度は、パスフレーズ画面が出力されます。

 echo "test" | gpg --clearsign

次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"Test Shiozumi <test@esmile-hd.com>"
2048ビットRSA鍵, ID 9970DB65作成日付は2021-04-08

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

test
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)

iQEcBAEBAgAGBQJgblWzAAoJECBEHISZcNtlysUH/jKtdGLqDqCdk7TBt7rbnUDn
RcPkrx5+ICNRg4/F9qgp4PPtc32BtT6kTlzN/XIKMBrbCHw5AND8R9aGtIXL3O93
nn5oZNFNm4Fl7ZISZNk2oM0frEWsi/xxu4Y/zsJKHEfkUx6hihE6gyhDW7rkUfpq
CKh+CGJAx1MgHmq63SDlygn+GV7hXptAeHfeSdZ2berHhPNV40pFM0FAi8XCibfg
KXdigJf1xXD2zHRnT1OmeIFdrG46DLnH4NKQDNnz5k6Eol+EOtJ7dKeRu7Ib75jp
InoPOu+FKlmlaTp7i9xh3uHPBaro4kolQyqt77z6IiklXUkgUr7HZs6/ovLdEOM=
=n6QI
-----END PGP SIGNATURE-----

gpg --clearsign オプションを指定して実行すると、設定したパスフレーズが解除されます。二回目以降、パスフレーズ入力画面も起動せずに、無事処理されます。

~/.bash_profile にも追加設定

当たり前ですけど、Tera Term から一度ログアウトすると、環境変数 GPG_TTY も初期化されてしますので、合わせて、~/.bash_profile にも追加して置きましょう!

$ cat ~/.bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH
export GPG_TTY=$(tty)

// ~/.bash_profile の最後に、設定を追加しました!

gpg --passwd <UserName> パスフレーズ再設定可能

gpg --clearsign オプションを解除されたパスフレーズの再設定は、gpg --passwd <UserName> コマンドで可能です。

パスフレーズ画面の不具合についての感想

原因は、そもそも単純なことで、GPG_TTY変数に画面の出力先のデバイスを設定すれば、それでよいのですが、gpg --gen-key の初期化時は、GPG_TTY変数を指定していなくても、アカウントさえ間違えず、rootでログインしなければ正常に動作するので、結果的には、やや謎になってしまいましたね。(^▽^;) まあ~、理解を深めたいかたは、もう一度、rm -rf ~/.gnupg で、フォルダーを削除して、何度かやり直してみましょう。

まとめ

さあ、今回はここまで、次回は、いよいよ署名付きのコミット、タグ作成を実行していきますね。正直なところ、GPGのパスフレーズ画面の不具合対応について、他の環境でどうなるのかは、調査不足で済みません。少なくとも、Mac環境の問題は、Googleで検索したところ、割と多そうでした。(^▽^;)

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/5844222172cf65
https://twitter.com/esmile2013