Git(及びGitHub)の環境設定周りの自分用チートシートである.Windows/MacOS/Ubuntuで動作確認済みである.苦行であるところのWindows環境の陥穽にも対応している.
Gitの基本設定
共通
# 変数設定
git config [--global] [--system] $VARIABLE $VALUE
# 設定確認
git config --list [--global] [--system]
- With
--global— 当該ローカルユーザがデフォルトで使用する設定.全てのローカルリポジトリに適用される - With
--system— 全てのローカルユーザがデフォルトで使用する設定.全てのローカルリポジトリに適用される- root権限が必要.Windows 11では
sudoコマンドがデフォルトでは使用できない.何故かPowerShellを管理者権限で実行しても権限エラーが出る.Git CMD(git-cmd.exe)を管理者として実行して,その上でgit config --systemコマンドを実行すれば設定変更できる
- root権限が必要.Windows 11では
- Without
--globalor--system— ローカルリポジトリのルートで実行する必要がある.当該リポジトリにのみ設定が適用される
なお,システム・グローバル・リポジトリ設定が重複して存在する場合,リポジトリ>グローバル>システムの優先度で適用される.(より範囲の狭い特定的な設定が優先される.)
ユーザ名及びメールアドレスを設定
git config [--global] user.name USERNAME
git config [--global] user.email example@example.com
これを設定しておくと git commit や git tag の実行時に --signoff フラグを立てると,自動的にメッセージ末尾に
Signed-off-by: USERNAME <example@example.com>
という行が追加されるようになる.(デジタル署名を打つ -S とは別物であることに注意.)
Gitが使用するエディタの設定
git commit で -m オプションを指定しなかった場合や,git rebase した場合などに起動するエディタを変更する場合は次のようにする.
# Cursorの場合
git config [--global] core.editor "Cursor --wait"
# Void Editorの場合
git config [--global] core.editor "Void --wait"
エディタの実行ファイルのパスが通っていないとエラーとなる.パスが通っているはずなのにエラーとなることもある.その場合は絶対パス指定すればよい.
デジタル署名
GitHubリモートリポジトリにcommit/tagをpushした際,GitHubのWebサイト上で実行した場合には,(GitHubアカウント認証を経ていることから)GitHubサービスの秘密鍵により署名が打たれ,GitHubリポジトリのログでは "Verified" マークとともに以下のような表示が為される.
GitHubのWebサイト上でpull requestをmergeした場合のmerge commitも同様である.
一方,とくに何の設定もせずローカルリポジトリ上でcommit/tagを作成した場合,署名は打たれない.これをGitHubリモートリポジトリにpushした場合,ログには "Verifier" マークは付かない.GitHubアカウントの設定によっては "Unverified" マークが表示される.
別にそれで困ることはないのだが,自分が作成したcommit/tagに必ず自分の秘密鍵で署名を打ち "Verified" マークを付けたい場合,以下の設定を行う.
GPG署名を用いる場合
GPG鍵ペアの生成
gpg --full-generate-key
鍵の用途,アルゴリズム,有効期限,署名者情報(名前 + メールアドレス)などを訊かれるので,それに答えていくとGPG鍵ペアが生成される.必ず署名用の鍵を生成すること.
GitHubが(検証を)サポートしているアルゴリズムは以下の通り:
- RSA
- 離散対数ベース
- DSA
- ElGamal
- 楕円曲線ベース
- ECDH
- ECDSA
- EdDSA
なお,GitHubによる署名検証においては,署名鍵のuidに設定されている署名者メールアドレスがGitHubアカウントに関連付けられたメールアドレス(メールアドレスを秘匿する設定をしている場合は "*@users.noreply.github.com" アドレスでも可)と一致しているかどうかもチェックする.したがって,GitHubによる "Verified" ステータスのためには,GitHubアカウントに関連付けられたメールアドレスをuidとして署名鍵を生成する必要がある.
GPG秘密鍵のkeyringへの登録
gpg --import $GPG_PRIVATE_KEY_PATH
GPG鍵IDの確認
gpg keyringに登録された秘密鍵リストを取得する.
gpg --list-secret-keys --keyid-format=long
以下のようなエントリが表示される:
sec ed25519/DEADBEEFDEADBEEF yyyy-mm-dd [SC] [expires: yyyy-mm-dd]
0123456789ABCDEF01234567DEADBEEFDEADBEEF
uid [ultimate] USERNAME <example@example.com>
ssb cv25519/DEADBEEFDEADBEEF yyyy-mm-dd [E] [expires: yyyy-mm-dd]
ssb ed25519/DEADBEEFDEADBEEF yyyy-mm-dd [S] [expires: yyyy-mm-dd]
ssb ed25519/DEADBEEFDEADBEEF yyyy-mm-dd [S] [expires: yyyy-mm-dd]
ssb ed25519/DEADBEEFDEADBEEF yyyy-mm-dd [S] [expires: yyyy-mm-dd]
ssb ed25519/DEADBEEFDEADBEEF yyyy-mm-dd [S] [expires: yyyy-mm-dd]
この例では署名用及び認証用(Sign&Certify)主鍵があり,副鍵として暗号化用(Encryption)鍵がひとつ,署名用(Sign)鍵が4つ含まれる.全ての鍵が楕円曲線Curve25519ベースの暗号・署名アルゴリズムを用いている.
我々の目的に必要なのは algo/HEX の HEX 部分である.これが各々の鍵のIDである.
Kleopatraを用いる場合
KleopatraというGnuPGのGUIアプリケーションを使ってもよい.鍵の生成・失効・インポート・エクスポート・サーバへの公開のほか,署名・暗号化や復号・検証などをサポートする.Kleopatraで生成又はインポートした鍵は自動的にGnuPGのkeyringへも登録される.
GPG署名鍵の git への登録
さきほど確認した署名用秘密鍵のIDを git に設定する:
git config [--global] user.signingkey $KEY_ID
これにより git commit や git tag の際に -S フラグを立てると署名が打たれるようになる.秘密鍵にパスフレーズを設定していた場合にはパスフレーズの入力が求められる.一度パスフレーズを入力すれば,復号された秘密鍵が一定期間 gpg にキャッシュされるので,毎回入力が求められることはない.
毎度 -S フラグを立てるのは面倒であるし,立て忘れることもある.フラグの有無によらず必ず署名を打つよう設定することもできる:
git config [--global] commit.gpgsign true
git config [--global] tag.gpgsign true
GitHubアカウントへのGPG公開鍵の登録
署名用秘密鍵に対応する公開鍵をGitHubアカウントに登録する.これにより,署名付きcommit/tagをリモートリポジトリにpushした際,署名検証が為されるようになる.なお,主公開鍵を登録すると,それに含まれる副鍵情報(副鍵ID)もまとめて認識される.したがって,主公開鍵を登録しておけば,副秘密鍵で署名した場合でも検証される.
GPG公開鍵はアカウント設定の "SSH and GPG keys" より登録できる.
- Title: 任意.署名者の名前,端末毎に鍵を使い分けているなら端末名,失効日などを含めておくと便利である
-
Key: 登録したいGPG公開鍵をテキストエディタなり
catコマンドなりで開いて,表示された文字列を貼り付ければよい
メールアドレスと鍵ID(副鍵IDを含む)は自動検出され登録済みGPG鍵の一覧に表示される.(よってTitleに含めなくても構わない.)
SSH署名を用いる場合
GitHubリモートリポジトリ(とくにプライベートリポジトリ)にSSHでアクセスしたり,commit/tagをSSHで署名したい場合には,以下の設定を行う.
SSH鍵ペアの生成
ssh-keygen -t ed25519 -C "example@example.com"
GitHubが対応しているアルゴリズムは以下の通り:
- SSH-RSA
- ECDSA-SHA2 with NIST P-256
- ECDSA-SHA2 with NIST P-384
- ECDSA-SHA2 with NIST P-521
- SSH-ED25519
- sk-ECDSA-SHA2 with NIST P-256
- sk-SSH-ED25519
SSH agentへのSSH秘密鍵の登録
ssh-add $PATH_TO_SSH_PRIVATE_KEY
SSH署名鍵の git への登録
# 署名方法をSSH鍵に変更
git config [--global] gpg.format ssh
# 署名用SSH鍵を設定
git config [--global] user.signingkey $SSH_PUBLIC_KEY_PATH
GitHubアカウントへのSSH公開鍵の登録
SSH公開鍵をGitHubアカウントに登録する.これにより
- 認証鍵として登録した場合: SSH秘密鍵を用いてGitHubアカウント認証を行うことで,リモートリポジトリに対して当該アカウントと同一権限でアクセスできるようになる
- 署名鍵として登録した場合: SSH秘密鍵を用いて署名されたcommit/tagをリモートリポジトリにpushした際,SSH公開鍵により署名検証が為されるようになる(GPG鍵の場合と同様)
SSH公開鍵はアカウント設定の "SSH and GPG keys" より登録できる.
- Title: GPG鍵と同様
- Key type: 認証鍵(Authentication Key)又は署名鍵(Signing Key)
-
Key: 登録したいSSH公開鍵をテキストエディタなり
catコマンドなりで開いて,表示された文字列を貼り付ければよい
ちなみにGitHubアカウントに登録されたSSH公開鍵は誰もが閲覧・ダウンロード可能である.具体的には
https://github.com/username.keys
より閲覧できる.第三者がSSH秘密鍵で署名されたcommit/tagを検証する場合には,上記URLからSSH公開鍵を取ってきて検証に使えばよい.
注意
GitにおいてGPG秘密鍵は専ら署名にのみ用いられ,侵害されても署名を偽造されるに留まる.(これでも十分に重大なインシデントだが.)一方,SSH鍵をGitHubのアカウント認証に利用している場合,侵害されるとGitHubアカウントのフルアクセス権を掌握されるおそれがある.したがって危殆化の際には速やかにアカウントからSSH公開鍵を削除すべきである.
Verified
以上の設定を行い,署名付きcommit/tagをリモートリポジトリにpushすれば,めでたく "Verified" マークが付く.
米国時間のクリスマスにcommit/pull requestを出して米国人を怖がらせましょう.
トラブルシューティング
git が gpg を見つけられない
パスが通っていないとか gpg が複数インストールされているとかで,git が gpg の解決に失敗することがある.以下のコマンドで git に gpg の居場所を教えてやればよい.
git config [--global] gpg.program $ABSOLUTE_PATH_TO_GNUPG
GPG署名時に "Inappropriate ioctl for device" が出る
Gitがcommit/tagに署名しようとした際,しばしばこのエラーが生じる.以下の方法で解消される.
gpgconf --kill gpg-agent
echo "test" | gpg --clearsign
署名形式をSSHからGPGに変更したい
git config [--global] --unset gpg.format
暗号アルゴリズム及び鍵長の選択について
楕円曲線ベースのアルゴリズムはRSAに比べて鍵長が圧倒的に短く高速である.
| bit security | key length (RSA) | key length (NIST P-*) |
|---|---|---|
| 112 | 2048 | 224 |
| 128 | 3072 | 256 |
| 192 | 7680 | 384 |
| 256 | 15360 | 521 |
ビットセキュリティに関して,112bit未満は即刻廃止,112bitは2030年までに128bit以上に移行すべきことが,各国の暗号関係の標準化機関から勧告されている.とくにこだわりがないなら楕円曲線ベースで128bit以上のセキュリティのもの(e.g. ED25519やNIST P-256など)を選ぶのがよい.
なお量子計算による危殆化はビットセキュリティとは別問題である.本記事執筆時点でGitHubはPQCに対応していない.
参考リンク
- 新しい GPG キーを生成する https://docs.github.com/ja/authentication/managing-commit-signature-verification/generating-a-new-gpg-key
- Git へ署名キーを伝える https://docs.github.com/ja/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key
- Kleopatra https://www.openpgp.org/software/kleopatra/
- GPG キーとメールの関連付け https://docs.github.com/ja/authentication/managing-commit-signature-verification/associating-an-email-with-your-gpg-key
- NIST SP 800-57 Part 1 Rev. 5 https://csrc.nist.gov/pubs/sp/800/57/pt1/r5/final
- CRYPTREC LS-0003-2022r1 https://www.cryptrec.go.jp/list/cryptrec-ls-0003-2022r1.pdf





