macOS Catalina で Git のコミットに署名を付けたお話。署名には OpenPGP の実装である GnuPG を使う。
想像図
用意するもの
homebrew package
- gnupg
- pinentry
- pinentry-mac
homebrew cask
- gpg-suite
鍵を作る
一般的な秘密鍵の暗号化方式は ed25519 だが、--expert
オプションがなければ使えない。
% gpg --full-gen-key --expert
細かい説明は gpg のはなしを読んでほしいが、目的に合わせて subkey を作ることができる。今回は署名と認証用にふたつ用意する。
Git に署名する
commit.gpgsign
オプションがあるので有効にしておく。user.signingkey
オプションで署名に使う Key ID を指定する。鍵の ID は --list-keys
(または --list-secret-keys
) オプションで出力できる1。
% cat ~/.gitconfig
───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: /Users/unlovingly/.gitconfig
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ [commit]
2 │ gpgsign = true
3 │ [user]
4 │ signingkey = B933F6FE0FC19F4F
───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
% gpg --list-keys --keyid-format long email@example.com
pub ed25519/5E4449CA75763271 2020-06-05 [C]
9FACEB719D03D05FF61045485E4449CA75763271
uid [ultimate] unlovingly <email@example.com>
sub ed25519/B933F6FE0FC19F4F 2020-06-05 [S] [expires: 2021-06-05]
sub ed25519/48AA4D1E17FF6BA9 2020-06-05 [A] [expires: 2021-06-05]
コミットするとき pinentry が秘密鍵のパス フレーズを訊ねてくる。Keychain Access.app に覚えさせることもできる (画像は pinentry-curses)。
あとは GitHub に鍵を登録すれば、冒頭の Verified バッジを得られる。
GitHub に鍵を登録する
GitHub アカウントへの新しい GPG キーの追加 - GitHub ヘルプ
SSH 接続で使う
Authenticate
用に subkey 48AA4D1E17FF6BA9
を用意した。
ところで GnuPG で公開鍵認証やるなら ssh-agent(1) ではなく gpg-agent(1) を使う。
% cat ~/.gnupg/gpg-agent.conf
───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: /Users/unlovingly/.gnupg/gpg-agent.conf
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ default-cache-ttl 86400
2 │ max-cache-ttl 86400
3 │ pinentry-program /usr/local/bin/pinentry-mac
───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
gpg-agent には認証する鍵のキーグリップを教える。
% gpg --list-secret-keys --with-keygrip email@example.com
sec ed25519 2020-06-05 [C]
9FACEB719D03D05FF61045485E4449CA75763271
Keygrip = 84500D69B6BAAF559687F31981319E74BF5B0386
uid [ultimate] unlovingly <email@example.com>
ssb ed25519 2020-06-05 [S] [expires: 2021-06-05]
Keygrip = 6ADFDE069EC89D029B34AA3B2409EAC3B5854709
ssb ed25519 2020-06-05 [A] [expires: 2021-06-05]
Keygrip = F304C7E7D0A5715E550FDAAE2237B0A44CADF5CC
% echo F304C7E7D0A5715E550FDAAE2237B0A44CADF5CC >> ~/.gnupg/sshcontrol
また、公開鍵を生成してリモート ホストに設定しておくこと。生成には --export-ssh-key
オプションを使う。引数は key ID を取る。suffix !
があると Authentication capability を確認しなくなる。
% gpg --export-ssh-key 48AA4D1E17FF6BA9
gpg-agent を起動しておく。
% gpgconf --launch gpg-agent
% cat ~/.ssh/config
───────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: /Users/unlovingly/.ssh/config
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ Host *
2 │ ForwardAgent yes
───────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
% ssh example.com
参考
- gpg のはなし
- そろそろ GnuPG でも ECC を標準で使うのがいいんじゃないかな — OpenPGP の実装 | text.Baldanders.info
- GnuPG - ArchWiki
- GitHub アカウントへの新しい GPG キーの追加 - GitHub ヘルプ
- gnupg - Are GPG and SSH keys interchangable? - Super User
- Git署名のウソホント - あまねけ!
-
この記事を書くとき鍵を作ったので冒頭の画像とは ID が違う ↩