GPG署名付きのコミットをする

GitHubサーフィンをしているとまれにコミットに署名(Verified)されたものがある。これは一体どうなっているのかと調べたらGNU Privacy Guardという暗号化ソフトで作られた鍵を使用したものらしい。コミットが偽装されることはないと思うが、せっかくなので取り入れてみることにした。これはその時のメモ。もちろん乱数は変えてある。

開発環境↓

% system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro16,3
      Processor Name: Quad-Core Intel Core i5
      Processor Speed: 1.4 GHz
      Number of Processors: 1
      Total Number of Cores: 4
      L2 Cache (per Core): 256 KB
      L3 Cache: 6 MB
      Hyper-Threading Technology: Enabled
      Memory: 16 GB
      System Firmware Version: 1554.100.64.0.0 (iBridge: 18.16.14556.0.0,0)

% sw_vers
ProductName:	macOS
ProductVersion:	11.3
BuildVersion:	20E232

% git --version
git version 2.31.1

% gpg --version
gpg (GnuPG) 2.2.27
libgcrypt 1.9.1

% pinentry-mac --version
pinentry-mac (pinentry) 1.1.0

% zsh --version
zsh 5.8 (x86_64-apple-darwin20.0)

% brew -v
Homebrew 3.1.5-101-gd3013fc

まずはHomebrewでGPGをインストール。

% brew install gpg

次に鍵を作成していく。なんか色々聞かれるけど答えていけばOK。

% LANG=C gpg --gen-key
gpg (GnuPG) 2.2.27; Copyright (C) 2021 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: directory '/Users/ki/.gnupg' created
gpg: keybox '/Users/ki/.gnupg/pubring.kbx' created
Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: Keiten Kiki
Email address: oo@kiki.ooo
You selected this USER-ID:
    "Keiten Kiki <oo@kiki.ooo>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? o
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: /Users/ki/.gnupg/trustdb.gpg: trustdb created
gpg: key 6GR6R7GPTXE84CVY marked as ultimately trusted
gpg: directory '/Users/ki/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/Users/ki/.gnupg/openpgp-revocs.d/HW27S6G7472ZC8C8YC4S33Q62FW5KCK2YLDLMGA6.rev'
public and secret key created and signed.

pub   rsa3072 2021-02-12 [SC] [expires: 2023-02-12]
      HW27S6G7472ZC8C8YC4S33Q62FW5KCK2YLDLMGA6
uid                      Keiten Kiki <oo@kiki.ooo>
sub   rsa3072 2021-02-12 [E] [expires: 2023-02-12]

生成された鍵を確認する。

% gpg -k
gpg: 信用データベースの検査
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
gpg: 次回の信用データベース検査は、2023-02-12です
/Users/ki/.gnupg/pubring.kbx
----------------------------
pub   rsa3072 2021-02-12 [SC] [有効期限: 2023-02-12]
      HW27S6G7472ZC8C8YC4S33Q62FW5KCK2YLDLMGA6
uid           [  究極  ] Keiten Kiki <oo@kiki.ooo>
sub   rsa3072 2021-02-12 [E] [有効期限: 2023-02-12]

上記のpubキーをコピーしてエクスポート。

% gpg -a --export HW27S6G7472ZC8C8YC4S33Q62FW5KCK2YLDLMGA6 > pubkey.gpg

この段階で鍵作成時に登録した名前とメールアドレスを設定ファイルに記述する。このテキストが間違ってると後で失敗するから注意。

% git config --global user.name "Keiten Kiki"

% git config --global user.email "oo@kiki.ooo"

一応確認。

% git config --list
credential.helper=osxkeychain
user.name=Keiten Kiki
user.email=oo@kiki.ooo

そして、GPGの情報も設定ファイルに追記していく。

% git config --global gpg.program /usr/local/bin/gpg

% git config --global user.signingkey "HW27S6G7472ZC8C8YC4S33Q62FW5KCK2YLDLMGA6"

% git config --global commit.gpgsign true

% git config --list
credential.helper=osxkeychain
user.name=Keiten Kiki
user.email=oo@kiki.ooo
user.signingkey=HW27S6G7472ZC8C8YC4S33Q62FW5KCK2YLDLMGA6
gpg.program=/usr/local/bin/gpg
commit.gpgsign=true

ここで試しにコミットしてプッシュするが失敗。

% git add .

% git commit -m "同じ品番を登録しようとした時のバリデーションを追加"
error: gpg failed to sign the data
fatal: failed to write commit object

調べるとMacの場合、pinentryがないとパスフレーズを入れられないらしい。

Homebrewでインストールする。

% brew install pinentry-mac

% echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf

% killall gpg-agent

これで上手くいった。

% git commit -m "同じ品番を登録しようとした時のバリデーションを追加"
[feature-validation eeae61f] 同じ品番を登録しようとした時のバリデーションを追加
 3 files changed, 184 insertions(+), 180 deletions(-)

公開鍵をGitHubに登録するためにクリップボードにコピー。設定からペーストする。

% cat pubkey.gpg | pbcopy
-----BEGIN PGP PUBLIC KEY BLOCK-----

ce*yzcN#8D*^Hz69U$cRVS3#GEyQg4ri4WDrFEdMDctqhg6U7wTiLYfWFgjbph*4
Un+DTY+TUf/7r0O0CJK0PGE5jBh5nrHWXP0voTSyGG5stI17bZAHDQc56Mr7C6iq
ZS!G$Px!s#vytb$EWx3H&FFJoNzn$z5sHEpCz&5^7VZ89Ty^x2v%p66jiU*jmbBN
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
=32A4


-----END PGP PUBLIC KEY BLOCK-----

こんな感じにペーストされるので保存すれば完了。署名付きのコミットができていればOK。

To comment

@TOC
閉じる