🏹

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

2021/04/08に公開

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

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

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

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

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

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: 鍵の生成が取り消されました。

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

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

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

こちらの原因は、いたってシンプルで、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

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

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

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-----

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

まとめ

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

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

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

Discussion