特定のリポジトリーで Git commit 時に署名するための設定
summary
当該リポジトリーの .git/config
に次のような設定が追加されている状態にする。 GPG 鍵を使うと良いだろう。
[user]
email = nanashino.gonbee@example.com
name = NANASHINO Gonbee
signingkey = 24A01C981CDE28D4
[commit]
gpgsign = true
設定手順
必要なソフトウェアをインストールする
macOS での手順。
HomeBrew を使って必要なものをいれる。 pinentry-mac はパスフレーズを入力するために使うもの。
brew install gpg pinentry-mac
次の内容のファイルを作成する。
pinentry-program /usr/local/bin/pinentry-mac
設定を読み込ませる。
gpgconf --kill gpg-agent
これで下準備は終わり。
鍵を生成する
GPG の公式サイトや man
コマンドはわかりづらい。 GitHub のページがほどよくまとまっているので参考にすると良い。
次のコマンドで鍵を生成する。ウィザードが立ち上がるので質問に答えていく。
gpg --full-generate-key
2024 年春の時点で、アルゴリズムは ed25519 を選択するのが良いようだ。
署名と暗号化
と 署名のみ
のどちらを選べばいいのかについては、今回の目的は署名なのでどちらを選んでも良い。
基本的に存命している限り同じ鍵を使うのが良いようなので、有効期限は無期限が良いようだ。が、 RSA 鍵がすでに安全でなくなってきているなど、同じ鍵を使い続けることにリスクが発生しているため、使う鍵を切り替える前提で判断したほうが良いと考えた。
メールアドレスは GitHub に登録しているものを使う。 GitHub には複数のメールアドレスを登録できるので使いたいものは先に登録しておくと良い。
まとめるとウィザードでの選択は次のようになる。
-
ECC (署名と暗号化)
もしくはECC (署名のみ)
を選ぶ -
Curve 25519
を選ぶ -
3y
と入力する - 本名を入力する
- アルファベット、漢字など好きなもので良い
- GitHub に登録済みのメールアドレスを入力する
- コメントは何を入力してもよい
- 目的などを書いておくと管理しやすいかも
- 空でも良い
- パスフレーズを入力する
- パスフレーズなしは推奨されていない
参考: 実行ログ
macOS Sonoma 上で HomeBrew でインストールした gpg コマンドによるログはこうなった。
$ gpg --full-gen-key
gpg (GnuPG) 2.4.5; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
ご希望の鍵の種類を選択してください:
(1) RSA と RSA
(2) DSA と Elgamal
(3) DSA (署名のみ)
(4) RSA (署名のみ)
(9) ECC (署名と暗号化) *デフォルト
(10) ECC (署名のみ)
(14) カードに存在する鍵
あなたの選択は? 9
ご希望の楕円曲線を選択してください:
(1) Curve 25519 *デフォルト
(4) NIST P-384
(6) Brainpool P-256
あなたの選択は? 1
鍵の有効期限を指定してください。
0 = 鍵は無期限
<n> = 鍵は n 日間で期限切れ
<n>w = 鍵は n 週間で期限切れ
<n>m = 鍵は n か月間で期限切れ
<n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)3y
鍵は金 3/26 00:47:49 2027 JSTで期限切れとなります
これで正しいですか? (y/N) y
GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。
本名: NANASHINO Gonbee
電子メール・アドレス: nanashino.gonbee@example.com
コメント: git commit 署名用
あなたは文字集合'utf-8'を使っています。
次のユーザIDを選択しました:
"NANASHINO Gonbee (git commit 署名用) <nanashino.gonbee@example.com>"
名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? o
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
gpg: 失効証明書を '/Users/janus/.gnupg/openpgp-revocs.d/E1C8277605BE0234229597FFB28F1B3F0D3DC3DA.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。
pub ed25519 2024-03-25 [SC] [有効期限: 2027-03-25]
E1C8277605BE0234229597FFB28F1B3F0D3DC3DA
uid NANASHINO Gonbee (git commit 署名用) <nanashino.gonbee@example.com>
sub cv25519 2024-03-25 [E] [有効期限: 2027-03-25]
次を打って、今作ったものが表示されるか確認する。
gpg --list-secret-keys
Git リポジトリーの設定を変更する
まず、作った秘密鍵の ID を取得する。
gpg --list-secret-keys --keyid-format long
すると次のように表示される。 ed25519/
のすぐ後ろの文字列が秘密鍵の ID 。ここでは 24A01C981CDE28D4
になる。
[keyboxd]
---------
sec ed25519/24A01C981CDE28D4 2024-03-25 [SC] [有効期限: 2027-03-25]
87ADE00682A24B6CE44979B518A05D987D1E2AD3
uid [ 究極 ] NANASHINO Gonbee <nanashino.gonbee@example.com>
ssb cv25519/E836A4E4B71FE7F4 2024-03-25 [E] [有効期限: 2027-03-25]
commit に署名したいリポジトリーへ移動して設定する。
git config commit.gpgsign true
git config user.signingkey "24A01C981CDE28D4"
メールアドレスと名前を変更する場合はそれも設定する。
git config user.email "nanashino.gonbee@example.com"
git config user.name "NANASHINO Gonbee"
コマンドを使わず、直接 .git/config
を編集しても良い。その場合は次のようになる。
[user]
signingkey = 24A01C981CDE28D4
email = nanashino.gonbee@example.com
name = NANASHINO Gonbee
[commit]
gpgsign = true
これで設定は終わり。あとはいつもと同じように commit する。
git add .
git commit -vm "sample commit"
確かめるには --show-signature
オプションをつけて show
や log
などのサブコマンドを使う。
git show --show-signature
# or
git log --show-signature
きちんと設定できていれば、コマンドの結果に次のような表示が付与されている。
gpg: 月 3/25 23:58:53 2024 JSTに施された署名
gpg: EDDSA鍵87ADE00682A24B6CE44979B518A05D987D1E2AD3を使用
gpg: "NANASHINO Gonbee <nanashino.gonbee@example.com>"からの正しい署名 [究極]
GitHub に公開鍵をアップロードする
公開鍵は次のように取得する。
gpg --armor --export 24A01C981CDE28D4
-----BEGIN PGP PUBLIC KEY BLOCK-----
と -----END PGP PUBLIC KEY BLOCK-----
で囲まれた文字列が表示される。これらをすべて含めたものが公開鍵となる。
GitHub の次のドキュメントを読みながら追加する。
鍵を保管する
作成した GPG 鍵はバックアップを取っておくのが良い。
gpg --export-secret-keys --armor --output private-key 24A01C981CDE28D4
パスフレーズの入力が求められる。入力に成功すると private-key
というファイルが作成されるので、これを安全なところにバックアップしておく。
Discussion