Featured image of post GitHubで署名付きコミットを反映させるための設定メモ

GitHubで署名付きコミットを反映させるための設定メモ

これはなに Link to this heading

GitHubで署名付きコミットを反映させるための設定のメモ。

署名付きコミットとは Link to this heading

署名付きコミットとは、コミットした人が本人であると証明するためのものである。

Gitで誰がコミットしたかという情報は、Gitで設定するuser.nameuser.emailで判断できる。しかし、これらの値は簡単にカスタマイズできるため、いくらでもなりすましができてしまう。このなりすましを回避し、本人であることを証明するのに、署名付きコミットは有用である。

署名付きコミットではGPGキーが利用される。GPGとは、GNU Privacy Guard の略で、データの暗号化や署名に利用できる。GPGキーは秘密鍵と公開鍵のペアで構成される。GPGキーを利用してコミットすると、コミットには秘密鍵で署名が付与される。この署名を公開鍵で検証することで、そのコミットが本人によって行われたと証明できる。

全体の流れ Link to this heading

GitHubで署名付きコミットを利用するための手順は以下のとおりである。

  1. GPGキーの作成
  2. GitHubへのGPGキーの登録
  3. GitにおけるGPGキーの設定
  4. 書名付きコミットを試す
  5. 署名付きコミットの確認

環境 Link to this heading

本記事は以下の環境で動作確認した。

  • WSL2 Ubuntu 22.04 LTS
  • Git 2.34.1
  • GnuPG 2.2.27

GPGキーの作成 Link to this heading

書名付きコミットをするために、GPGキーを作成する。

GnuPGのインストール Link to this heading

GPGキーは、GnuPG というGPGのCLIツールを利用して作成する。このツールを入れるとgpgコマンドが使えるようになる。インストールのしかたはOSによって異なるため、公式サイト を参照すること。

GnuPGが正常にインストールされていれば、以下のコマンドでバージョンを確認できる。

$ gpg --version
gpg (GnuPG) 2.2.27
libgcrypt 1.9.4
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /home/user/.gnupg
サポートしているアルゴリズム:
公開鍵: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
暗号方式: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
      TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
ハッシュ: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
圧縮: 無圧縮, ZIP, ZLIB, BZIP2

主鍵の作成 Link to this heading

GPGキーは以下のコマンドで作成できる。

gpg --full-generate-key
新しい GPG キーを生成する - GitHub Docs's image

新しい GPG キーを生成する - GitHub Docs

既存の GPG キーがない場合は、新しい GPG キーを生成してコミットおよびタグの署名に使用できます。

docs.github.com

鍵の作成時に--expertオプションを付けると、より詳細な設定ができる。たとえば、gpgのバージョンによっては--expertオプションをつけないとECCで鍵が作れない。

gpg --full-generate-key --expert

コマンドを実行すると、プロンプトで鍵の作成に関する質問が表示される。聞かれるのは以下のような質問である。

  • 鍵の種類(RSA、ECCなど)
  • 鍵の長さ
  • 鍵の有効期限
  • 鍵のユーザー情報
    • ユーザー名
    • メールアドレス
    • コメント
  • パスフレーズ

最初に鍵の種類を選択する。選択肢は以下の通りである。

$ gpg --full-generate-key --expert
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.

ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
   (7) DSA (機能をあなた自身で設定)
   (8) RSA (機能をあなた自身で設定)
   (9) ECC と ECC
  (10) ECC (署名のみ)
  (11) ECC (機能をあなた自身で設定)
  (13) 既存の鍵
  (14) カードに存在する鍵
あなたの選択は? 11

ここで作成する鍵は、鍵の認証にのみ利用する。そのため、鍵の認証機能のみを持つ鍵を生成する。上記の選択肢には認証機能のみを持つ鍵の選択肢はないため、RSAやECCでも機能を自分で設定する選択肢(e.g. RSA (機能をあなた自身で設定)ECC (機能をあなた自身で設定))を選ぶ。

たとえば、選択肢11ECC (機能をあなた自身で設定))を選ぶと、以下のような質問が表示される。

鍵ECDSA/EdDSAに認められた操作: Sign Certify Authenticate
現在の認められた操作: Sign Certify

   (S) 署名機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は?

この現在の認められた操作が鍵の機能を示す。Sign Certifyの場合、署名(Sign)と鍵の認証(Certify)の機能が両方付与されている。ここで作成する鍵は鍵の認証にのみ利用するため、署名の機能(S)を削除する。Sを選択すると、署名の機能が削除される。

あなたの選択は? S

鍵ECDSA/EdDSAに認められた操作: Sign Certify Authenticate
現在の認められた操作: Certify

   (S) 署名機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は? Q

現在の認められた操作CertifyのみになったらQを選択して設定を完了する。

次に、RSAなら鍵の長さ、ECCなら曲線の種類を選ぶ。個人の好みとしては、RSAなら40961ECCならcurve25519を選ぶのがよいだろう。

ご希望の楕円曲線を選択してください:
   (1) Curve 25519
   (3) NIST P-256
   (4) NIST P-384
   (5) NIST P-521
   (6) Brainpool P-256
   (7) Brainpool P-384
   (8) Brainpool P-512
   (9) secp256k1
あなたの選択は? 1

次に、鍵の有効期限を設定する。有効期限は0を選ぶと無期限になる。有効期限を設定する場合は、1y(1年)、2y(2年)などの形式で設定する。セキュリティの観点では、定期的な鍵の更新のために、有効期限を設けることが推奨される。

鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0) 0
鍵は無期限です

次に、鍵のユーザー情報を設定する。ユーザー名、メールアドレス、コメントを設定する。ユーザー名とメールアドレスは必須、コメントは任意である。おそらく本来は本名や実際のメールアドレスを設定すべきだが、別に架空の名前でも良い。

注意点として、ここで設定するメールアドレスは、GitHubに登録しているメールアドレスと同一のものにしなければならない。GitHubは、GPGキーのメールアドレスとGitHubのメールアドレスが一致している場合、署名付きコミットを認識する。

最後に、パスフレーズを設定する。パスフレーズは秘密鍵を保護するためのもので、他人に知られてはならない。パスフレーズは長く複雑なものを設定するのが望ましい。パスフレーズは鍵の利用時に要求されるため、必ず記録しておくこと。パスワードマネージャーを利用するのがよいだろう。

以上でGPGキーが生成される。作成された鍵は次のコマンドで確認できる。

gpg -k

たとえば、次のような情報が表示される。

$ gpg -k
/home/user/.gnupg/pubring.kbx
--------------------------------
pub   ed25519 YYYY-MM-DD [C]
      1234567890ABCDEF1234567890ABCDEF12345678
uid           [  究極  ] UserName <example@mail.com>

この手順で作成されるGPGキー(pubのところに表示されるもの)は主鍵と呼ばれる2

主鍵の[C]の表記は、主鍵に鍵の認証(Certify)の機能が付与されていることを示している。もし、主鍵に認証の機能(C)がない場合は、主鍵の機能を変更する必要がある。

設定次第では、主鍵でも書名付きコミットはできる。しかし、セキュリティ上の理由から、主鍵を日常的に利用するのは避けるべきである。基本的に、主鍵は副鍵を保証するのだけに利用する。日常的に利用する署名や認証には、このあと作成する副鍵を利用する。これにより、情報漏洩時のリスクを軽減できる。

副鍵の作成 Link to this heading

副鍵の作成方法は次のとおりである。まず、主鍵のIDを調べる。

gpg --list-secret-keys --keyid-format LONG

すると、以下のような情報が表示される。

~$ gpg --list-secret-keys --keyid-format LONG
/home/user/.gnupg/pubring.kbx
--------------------------------
sec   ed25519/SYUKAGINOID YYYY-MM-DD [C]
      1234567890ABCDEF1234567890ABCDEF12345678
uid                 [  究極  ] UserName <example@mail.com>

この中で、SYUKAGINOIDが主鍵のIDである。このIDを使って副鍵を作成する。

まず、次のgpgコマンドを実行する。

gpg  --expert --edit-key <主鍵のID>

すると、以下のようなプロンプトが表示される。

gpg>

このプロンプトで、addkeyコマンドを実行する。実行時のプロンプトは以下のようになる。

gpg> addkey

addkeyコマンドを実行すると、主鍵作成時と同様の質問が表示される。注意点として、GitHubの署名付きコミットを利用する場合、副鍵は署名(Signed)の機能を持つように作成しなければならない。逆に言うと、署名の機能だけを持つ副鍵を作成すれば十分である。

たとえば、以下の選択肢が表示され、ECCの副鍵を作成する場合、署名の機能だけを持つ副鍵を作成するには10を選択する。

gpg> addkey
ご希望の鍵の種類を選択してください:
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
   (5) Elgamal (暗号化のみ)
   (6) RSA (暗号化のみ)
   (7) DSA (機能をあなた自身で設定)
   (8) RSA (機能をあなた自身で設定)
  (10) ECC (署名のみ)
  (11) ECC (機能をあなた自身で設定)
  (12) ECC (暗号化のみ)
  (13) 既存の鍵
  (14) カードに存在する鍵
あなたの選択は? 10

質問に回答すると副鍵3が作成される。生成された副鍵は次のコマンドで確認できる。

gpg -k

たとえば、次のような情報が表示される。

$ gpg -k
/home/user/.gnupg/pubring.kbx
--------------------------------
pub   ed25519 YYYY-MM-DD [C]
      1234567890ABCDEF1234567890ABCDEF12345678
uid           [  究極  ] UserName <example@mail.com>
sub   ed25519 YYYY-MM-DD [S]

このsubに表示される情報が副鍵である。副鍵の[S]の表記は、副鍵に署名(Sign)の機能が付与されていることを示している

GitHubへのGPGキーの登録 Link to this heading

鍵を生成したら、GitHubに公開鍵を登録する。まず、署名に利用する鍵のIDを確認する。

gpg --list-secret-keys --keyid-format LONG

すると、以下のような情報が表示される。

$ gpg --list-secret-keys --keyid-format LONG
/home/user/.gnupg/pubring.kbx
--------------------------------
sec   ed25519/SYUKAGINOID YYYY-MM-DD [C]
      1234567890ABCDEF1234567890ABCDEF12345678
uid                 [  究極  ] UserName <example@mail.com>
ssb   ed25519/FUKUKAGINOID YYYY-MM-DD [S]

この中で、FUKUKAGINOIDが署名に利用する鍵のIDである。このIDを使って公開鍵を取得する。公開鍵の情報は以下のコマンドで取得できる。

gpg --armor --export <key-id>

たとえば、FUKUKAGINOIDの公開鍵を取得するには、次のコマンドを実行する。

gpg --armor --export FUKUKAGINOID

すると、以下のような公開鍵が表示される。

$ gpg --armor --export FUKUKAGINOID
-----BEGIN PGP PUBLIC KEY BLOCK-----

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

この-----BEGIN PGP PUBLIC KEY BLOCK-----から-----END PGP PUBLIC KEY BLOCK-----までの部分が公開鍵である。

Add new GPG keys へアクセスし、上記の公開鍵をコピー&ペーストして登録する。-----BEGIN PGP PUBLIC KEY BLOCK----------END PGP PUBLIC KEY BLOCK-----も含めてコピーすること

以上で、GitHubで書名付きコミットを利用するための設定が完了した。

GitにおけるGPGキーの設定 Link to this heading

手元でgit commitする際に使うGPGキーを設定する。

git config --global user.signingkey <key-id>

たとえば、今回はFUKUKAGINOIDを使うので、次のように設定する。

git config --global user.signingkey FUKUKAGINOID

書名付きコミットを試す Link to this heading

書名付きコミットをするには、3つの方法がある。

  1. コミット単位で書名付きコミットをする
  2. リポジトリ内のすべてのコミットを書名付きにする
  3. すべてのリポジトリで署名付きコミットをデフォルトにする

コミット単位で書名付きコミットをする Link to this heading

コミット単位で書名付きコミットをするには、-Sオプションを利用する。

git commit -S -m "commit message"

リポジトリ内のすべてのコミットを書名付きにする Link to this heading

リポジトリ内のすべてのコミットを書名付きにするには、そのリポジトリのディレクトリ内で、Gitのlocalのconfigを変更する。

git config commit.gpgsign true

これにより、そのリポジトリでは、-Sオプションを付けずにコミットしても、署名付きコミットが行われる。

すべてのリポジトリで署名付きコミットをデフォルトにする Link to this heading

すべてのリポジトリで署名付きコミットをデフォルトにするには、Gitのglobalのconfigを変更する。

git config --global commit.gpgsign true

これにより、すべてのリポジトリで、-Sオプションを付けずにコミットしても、署名付きコミットが行われる。

署名付きコミットの確認 Link to this heading

署名付きコミットを確認するには、git logコマンドを利用する。

git log --show-signature

GitHub上だと、コミットの右側にVerifiedと表示される。

GitHub上で書名付きコミットを確認

Appendix | 署名付きタグの設定 Link to this heading

書名付きのタグも作成できる。署名付きタグを作成するには、-sオプションを利用する。

git tag -s <tag-name>

git configの設定で、デフォルトでタグに署名をつけるように設定できる。

git config --global tag.gpgsign true

参考文献・URL Link to this heading

GPG で始める暗号・署名ライフ - blog.livewing.net's image

GPG で始める暗号・署名ライフ - blog.livewing.net

PGP (Pretty Good Privacy) の実装のひとつである GPG (GNU Privacy Guard) を使用して鍵を生成する方法をゼロから紹介します。 また、ファイルを暗号化・署名してやりとりする方法や、 Git のコミットに署名をつける方法、エンジニアフレンドリーなパスワードマネージャー Pass によるパスワード管理の方法なども紹介します。 メールでパスワードつき zip ...

blog.livewing.net
GPGキーの設定 (2023-10-13記録)'s image

GPGキーの設定 (2023-10-13記録)

zenn.dev
Windows, WSL, DevContainerでコミットを署名する's image

Windows, WSL, DevContainerでコミットを署名する

zenn.dev
GitHub 上で表示されるコミットを署名付きにする方法 - Qiita's image

GitHub 上で表示されるコミットを署名付きにする方法 - Qiita

実現できることこの記事の手順を実践すると、GitHub 上のコミット欄に "Verified" マークをつけることができる。単にマークをつけられるだけでなく、そのコミットが本人のものであるという…

qiita.com

  1. 長いほうがセキュリティ的に良い。 ↩︎

  2. 生成時の鍵の種類の選択によっては、主鍵と副鍵のペアで作成されることもある。たとえば、鍵の種類をRSA と RSA (デフォルト)にした場合は、主鍵と副鍵のペアで作成される。 ↩︎

  3. 副鍵は主鍵に紐づいており、主鍵の証明書に副鍵の情報が含まれる。副鍵は主鍵によって署名されているため、副鍵が信頼できるかどうかは主鍵に依存する。 ↩︎

Licensed under CC BY-NC-SA 4.0
最終更新 8月 17, 2024
Hugo で構築されています。
テーマ StackJimmy によって設計されています。