🏹

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

2021/04/08に公開

みなさんこんにちは! さあ~、前回で無事に、GPGの環境設定が完了しましたね。今回は、タグやコミットに対して、実際に署名を付加してみますよ!

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

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

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

https://zenn.dev/shiozumi/articles/bbd681d2c3b671

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

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

rm -rf ~/.gnupg で、真っ新な状態から開始!

私は既に環境が完成しているので、もう一度、GPGの設定を削除するところから!

$ rm -rf ~/.gnupg

export GPG_TTY=$(tty) GPGの環境変数設定

パスフレーズ画面の表示で、エラーが起きないように、環境変数も先に設定します!

$ export GPG_TTY=$(tty)

$ echo $GPG_TTY
/dev/pts/1

// 今回は、出力先のデバイスが、/dev/pts/1 になりました!

gpg --gen-key でキーの作成

$ gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: ディレクトリ「/home/shiozumi/.gnupg」が作成されました

// 中略~

ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
あなたの選択は? 1  <!-- 1番を選択

RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048) 2048  <!-- 2048と入力

要求された鍵長は2048ビット

鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)0   <!-- 0を入力

(null)は無期限です
これで正しいですか? (y/N) y   <!-- 勿論、yを入力

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: Makoto Shiozumi  <!-- user.name と同じにしましょう!
電子メール・アドレス: shiozumi@esmile-hd.com <!-- user.email と合わせて!
コメント:  <!-- ここは、何も入力しないで、改行すると以下の設定になります。
次のユーザIDを選択しました:
    "Makoto Shiozumi <shiozumi@esmile-hd.com>"

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
// ↑↑↑ 大文字の、Oオーを入力して、パスフレーズ画面が無事に起動すれば、OK!

秘密鍵を保護するためにパスフレーズがいります。

たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動かす、
ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生成器に
十分なエントロピーを供給する機会を与えることができます。
gpg: /home/shiozumi/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵00E07A56を絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。

gpg: 信用データベースの検査
gpg: 「ギリギリの信用」3、「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/00E07A56 2021-04-08
   フィンガー・プリント = 69A6 E335 76F8 08BB 6A06  D767 4252 4935 00E0 7A56
uid                  Makoto Shiozumi <shiozumi@esmile-hd.com>
sub   2048R/15077827 2021-04-08

gpg --gen-key 短縮ハッシュ値 00E07A56 確認!

$ gpg --list-keys
/home/shiozumi/.gnupg/pubring.gpg
---------------------------------
pub   2048R/00E07A56 2021-04-08
uid                  Makoto Shiozumi <shiozumi@esmile-hd.com>
sub   2048R/15077827 2021-04-08

--keyid-format LONG 4252493500E07A56 も確認

$ gpg --list-keys --keyid-format LONG
/home/shiozumi/.gnupg/pubring.gpg
---------------------------------
pub   2048R/4252493500E07A56 2021-04-08
uid                          Makoto Shiozumi <shiozumi@esmile-hd.com>
sub   2048R/6B03A64A15077827 2021-04-08

pub 行の、00E07A56 を、signingkeyに設定

git config --global user.signingkey 00E07A56
git config --global user.name "Makoto Shiozumi"
git config --global user.email "shiozumi@esmile-hd.com"

$ git config --global --list
user.email=shiozumi@esmile-hd.com
user.signingkey=00E07A56
user.name=Makoto Shiozumi

では、git init で環境の初期化!

$ mkdir func0075  && cd $_

$ git init
Initialized empty Git repository in /home/shiozumi/mygit/func0075/.git/

$ echo "func0075 GPG" > README.md

$ git add README.md

// ここまでは、通常の今までと同じですね。

いよいよ、署名付きコミット!

GPGの環境設定に問題がなければ、パスフレーズ画面が表示されます。

$ git commit -S -m "1st"

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

[master (root-commit) df18297] 1st
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

パスフレーズ画面が表示されたら、正常動作です![2]

エラーメッセージが出る場合は、第七十四回を参考![3]

error: gpg failed to sign the data
fatal: failed to write commit object
// ↑↑↑ エラーを出力して処理が中断されます!(^▽^;)

git log --show-signature で署名を確認!

$ git log --show-signature
commit df1829708c732f31b427653c2543498048894d39 (HEAD -> master)
gpg: 2021年04月08日 12時19分01秒 JSTに施された署名
gpg:                RSA鍵4252493500E07A56を使用
gpg: "Makoto Shiozumi <shiozumi@esmile-hd.com>"からの正しい署名
Author: Makoto Shiozumi <shiozumi@esmile-hd.com>
Date:   Thu Apr 8 12:18:56 2021 +0900

    1st
[shiozumi@ovs-009 func0075]$
  1. gpg: 2021年04月08日 12時19分01秒 JSTに施された署名
  2. gpg: RSA鍵4252493500E07A56を使用
  3. gpg: "Makoto Shiozumi shiozumi@esmile-hd.com"からの正しい署名

git tag -s v1.0 -m 'my signed 1.0 tag'

こちらのコマンドで、タグも署名付きで作成してみましょう!

$ git tag -s v1.0 -m 'my signed 1.0 tag'

$ git tag
v1.0
// 無事に作成されました!

// それでは早速、内容を確認!

$ git tag -v v1.0
object df1829708c732f31b427653c2543498048894d39
type commit
tag v1.0
tagger Makoto Shiozumi <shiozumi@esmile-hd.com> 1617852889 +0900

my signed 1.0 tag
gpg: 2021年04月08日 12時34分54秒 JSTに施された署名
gpg:                RSA鍵4252493500E07A56を使用
gpg: "Makoto Shiozumi <shiozumi@esmile-hd.com>"からの正しい署名

まとめ

さあ~、今回はいかがでしたか? これで、コミットやタグに署名が付きましたね。尚、次回は、こちらのリポジトリを、GitHubにpushしてから、他のアカウントで、pull してみます。お互いにお互いの署名の公開鍵を登録しておかないとエラーになりますけど、、、その辺りのテスト、学習を行って行きます!

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

https://zenn.dev/shiozumi/articles/e96f97071a36db
https://twitter.com/esmile2013

脚注
  1. ~/.bash_profile の設定方法は、前回、第七十四回を参考にしてください! ↩︎

  2. echo "test" | gpg --clearsign でパスフレーズを一度クリアすると、パスフレーズ画面は表示されません。パスワードなしで署名可能です。 ↩︎

  3. 申し訳ございませんが、MacやWin環境での不具合には対応していません。各個人で、Google先生にお尋ねください。m(_)m ↩︎

Discussion