🔑

GithubでGPG認証エラーが発生したら

2024/09/23に公開1

GitHubでのGPG

このページにたどり着いた人はすでに知っていると思いますが、gitではGPG(Gnu Private Guard)を用いて、commitやtagにsignすることができます。GitHubでは、このsignを用いて認証を行い、認証が成功したものに関しては、verifiedというマークを付与します。
自分の勤務先では複数のレポジトリでverifiedなcommit以外を受け付けないルールが設定されており、これを解消するためにしたことをメモとして残しておきたいと思います。

GPGキーの生成

Githubで作成方法が紹介されていますが一応手順を乗せておきます

  1. 以前にGPGキー作成している可能性もありますので、既存のgpgキーの所在を確認しておきます
    gpg --list-keys --keyid-format short
    
    もし何も表示されなけれキーがないので以下の手順でキー生成を、もしキーが存在すればGithubに登録まで飛んでもらって構いません。そもそもgpgコマンドがインストールされていなかった場合は、こちらからバイナリをインストールして下さい。
  2. キーの生成
    gpg --full-generate-key
    
  3. 生成キーの確認
    gpg --list-keys --keyid-format short
    #pub   rsa4096/ABCDE123 2024-09-22 [SC] [expires: 2025-09-22]
    #      8E579C1xxxxxxxxxxxxxx
    #uid         [ultimate] Hoge Fuga <example@example.com>
    #sub   rsa4096/FGHD45678 2024-09-22 [E] [expires: 2025-09-22]
    #sub   rsa2048/IJK901234 2024-09-22 [S] [expires: 2025-09-22]
    

Githubに登録

GihubにはGPGキーの中身を登録する必要があります。すでに存在していた、あるいは新たに作成したGPGキーの中身を見るには、pubkeyのIDを使用して以下のようなコマンドを実行します(IDをABCDE123としています)

gpg --armor --export  ABCDE123

実行結果をコピーしてGithubのAccount > Settings > SSH and GPG keys URL: https://github.com/settings/keys にある GPG keysに登録する必要があります。
このとき、GitHubに登録されているメールアドレスに鍵の生成時に入力したメールアドレスが含まれている必要があります。

メールアドレスが異なる場合 > GPGキーのメールアドレス変更方法

コマンドラインで以下のコマンドを実行してGPGキーのリストを表示します。

gpg --list-keys

ここで改めて自分が持っているGPGキーのIDを確認してください。

次にGPGキーの情報を編集します。

gpg --edit-key <key_id>

adduid コマンドを使って新しいメールアドレスを追加します。プロンプトに従っ必要な情報を入力ます。

もし必要であれば、古いメールアドレスを削除することもできます。deluid コマンドを使用し、削除したいメールアドレスの番号を選びます。最後に変更を保存します。save コマンドを入力してください。

今後のCommitで自動的にGPGキーで認証されるように設定

git config --global commit.gpgsign true

すでにcommitした内容についてGPG認証付きコミットに更新したい場合

ブランチ内のすべてのコミットに対して署名を追加するために、インタラクティブリベースを使用します。以下のコマンドを実行しますが、HEAD~<n>の部分には、リベース対象とするコミット数を指定してください。すべてのコミットをリベースするためには、HEAD~<n>を一番古いコミットまで遡る形に変更します。例えば、ブランチに5つのコミットがある場合、HEAD~5とします。

  1. rebae

    git rebase --interactive --exec 'git commit --amend --no-edit --gpg-sign' HEAD~<n>
    

    例えば、ブランチ内に最新から過去に遡って5回のコミットがある場合:

    git rebase --interactive --exec 'git commit --amend --no-edit --gpg-sign' HEAD~5
    
  2. 再コミット
    上記コマンドを実行すると、エディタが開いてコミット履歴が表示されます。何も変更せずにそのまま保存して閉じます。Gitは指定されたスクリプトを使って各コミットを再署名します。

  3. リモートリポジトリにプッシュ
    署名の追加が完了したら、リモートリポジトリに強制プッシュする必要があります。

    git push --force-with-lease
    

Discussion

wakit(y.ueno)wakit(y.ueno)

GPGキーを特定のレポジトリ配下だけに設定したい

対象リポジトリに移動し、ローカル設定を変更

  1. 対象リポジトリのディレクトリにcdコマンドで移動。
  2. コミット時に使うユーザ名・メールアドレス・GPGキーIDを設定します。

git config user.name "任意の名前(例: your personal name)"
git config user.email "example@domain.com"
git config user.signingkey "個人用GPGキーのID (例: C546127D07AE0BFE)"
git config commit.gpgsign true

これらはすべて「--local」オプションを省略しても、リポジトリのルートディレクトリで実行すればローカル設定(~/.gitconfig より優先される .git/config)になります。
もし明示的に「ローカルレベル」でやりたい場合は、たとえば:
git config --local user.email "example@domain.com"
のように --local をつけてもOKです。

設定が正しく反映されているか確認

以下のコマンドで、どのファイルから (グローバルorローカル) その設定が読み込まれているか確認できます。

git config --show-origin user.email
git config --show-origin user.signingkey
git config user.email
git config user.signingkey

表示されたメールアドレスとサイニングキーが「example@domain.com」「個人用GPGキーID」になっていればOKです。

新たにコミットを作成しサインが反映されたかチェック

  1. 試しに何かファイルを変更し、
    git commit -S -m "Test commit for personal GPG key"
    のようにコミットを行う。
  2. 署名状態を確認:
    git show --show-signature HEAD
    ここで「Author: … example@domain.com」と表示され、かつ「Good signature from …(設定したアドレス)」などとなっていれば、正しく署名が反映されています。

まとめ

• 特定レポジトリだけ個人用メール&GPGを使いたい場合は、リポジトリ直下(.git/config)で user.email・user.signingkey を設定すればOK。
• 既に仕事用としてグローバル設定が入っていても、ローカル設定が優先されるので、他のリポジトリには影響しません。
• GitHub側では「example@domain.com」に紐づいた公開鍵(GPGキー)を登録しているアカウントであれば、コミットがVerified扱いになります。