LoginSignup
0
0

More than 3 years have passed since last update.

Git のコミットに署名がほしい

Posted at

macOS Catalina で Git のコミットに署名を付けたお話。署名には OpenPGP の実装である GnuPG を使う。

想像図

2020-06-06 00.36.17 github.com 747e16c355c1.png

用意するもの

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)。

pinentry.png

あとは GitHub に鍵を登録すれば、冒頭の Verified バッジを得られる。

GitHub に鍵を登録する

GitHub アカウントへの新しい GPG キーの追加 - GitHub ヘルプ

SSH 接続で使う

Authenticate 用に subkey 48AA4D1E17FF6BA9 を用意した。

ところで GnuPG で公開鍵認証やるなら ssh-agent(1) ではなく gpg-agent(1) を使う。

gpg-agent には OpenSSH エージェントのエミュレーション機能が存在します。

% 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

参考


  1. この記事を書くとき鍵を作ったので冒頭の画像とは ID が違う 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0