🔐

GitコミットをGPG署名する方法(Mac+Sourcetree)

2024/04/04に公開1

現場でGPG署名の設定をする必要があったため、備忘録として記事作成。割と情報が錯綜してわかりにくかったので整理してまとめた。

◆署名するメリット

Gitコミットに紐づく情報は、git configで管理されているため、git configで同じメールアドレスを登録すれば、なりすましが容易にできてしまう。
そこで、Gitコミットをデジタル署名(GPG署名)すれば、そのなりすましを防止することが可能。

●偽装方法

リンク参照 > https://qiita.com/s6n/items/bb869f740a53a3bf169e

◆署名方法

●事前準備

■Git設定

git configの情報を設定する必要がある

  1. Gitインストール
  2. Gitのユーザー名を設定する > git config --global user.name "ユーザー名"
  3. Gitのメールアドレスを設定する > git config --global user.email "メールアドレス"
  4. 2,3の設定が反映されることを確認する > git config -l

■Homebrewインストール

Homebrew使ってGPGインストールしていくので、先にHomebrewをインストールする
https://brew.sh/ja/

■Sourcetreeインストール

適当にインストール

■確認用Githubリポジトリを作成する

署名できるか確認するために、確認用Githubリポジトリを作成する

●GPGインストール〜GPG鍵設定

  1. GPGインストール > brew install gpg pinentry-mac
  2. 新しいFULL鍵生成する > gpg --full-generate-key
    コマンド押下後の設定は、リンクのQ1~Q6参照
    https://qiita.com/shotakaha/items/65a708f96edbe948eb79

パスフレーズは空欄以外を設定。以降、コミットするときに必要なので必ずメモを取ること!

  1. GPG鍵をメモする
    生成すると、いろんなメッセージが表示されるが、下記の"鍵のID"がGPG鍵になるので、メモする
    pub rsa4096 2019-11-08 [SC] "鍵のID"

  2. 秘密鍵をPCに出力 > gpg --export-secret-keys "鍵のID" > privkey.gpg

  3. 公開鍵をPCに出力 > gpg --armor --export "鍵のID" > pubkey.gpg

  4. GitにGPGの設定をする

  • git config --global gpg.program "/usr/local/bin/gpg"
  • git config --global user.signingkey "鍵のID"
  • git config --global commit.gpgsign true
  1. 公開鍵をGithubに登録する
  • 出力した公開鍵pubkey.gpgを、テキストエディタで開いてコピーする
  • コピーした内容をGithubに登録する
  1. 確認用リポジトリにPushするプロジェクトを作成(なんでもいい)

  2. 作成プロジェクトをgit initする

  3. ステージングにあげてgit add .署名付きコミットを実行する > git commit -S -m "コミットメッセージ"
    ※コミットした際にエラーerrro: gpg failed to sign the dataが出てしまうときは、export GPG_TTY=$(tty)コマンドを実行して、再度コミットする。

  4. コミットしたら、確認用リポジトリにPushして、Githubのコミット履歴より、対象コミットがVerifiedが付与されているか確認する
    ※署名できてないコミットは、Unverifiedとなる

実際にGithubにPushした画像を下記に記載する。

●補足

登録したGPG鍵情報の確認は、gpg --list-secret-keys --keyid-format LONGから確認できる。

●Sourcetreeから署名コミットする設定ができない件

下記を設定しても、署名コミット実行しようとしたらエラーが表示されてしまい、コミットできない。

調査してみたところ同様の不具合らしきものが、Sourcetreeの不具合として上がっていて未解決になっている。
https://jira.atlassian.com/browse/SRCTREEWIN-8527

ターミナルからのコマンドからは署名コミットできるので、コミットのみターミナルで行い、それ以外の操作をSourcetreeで行うという、併用して使用することで、とりあえず問題は回避できる。
※ターミナルからコミットする方法:git commit -S -m "コミットメッセージ"(-Sが署名するオプション)。コマンド実行後にパスフレーズを聞かれるので、設定したパスフレーズを入力すると署名コミットされる。

今回は、備忘録として、SourcetreeでGPG鍵を使用するための設定手順だけ下記に記載する。

■SourcetreeでGPG鍵を使用するための設定手順

  1. 言語設定を英語にすると、Settings > Advanceが表示される(日本語だとなぜか設定できない)
  • 日本語は「高度な設定」がdisableされてて選択できない(修正してくれ)
  • EnglishでのAdvancedの画面から、GPG Programを設定できる
  1. リンクの「設定方法」項目の設定を実施 > https://zenn.dev/yusuga/articles/d0bee79c32b0f3

★リンク記事のわかりにくいところ、間違いを下記に列挙する

  • intelチップ
    • 「/usr/local/bin/gpgsに設定する」 -> 「/usr/local/binに設定」の間違い
    • GPG Programを「/usr/local/binに設定」するとき、、「Browser(参照)」ボタンからフォルダ参照する方法
      • ルートフォルダを「Macintosh HD」にする
      • usrは隠しフォルダ。shift + command + .で表示
      • 「/usr/local/bin」を指定
  • Sourcetreeの「Repository > Repository Setting... > Securityでリポジトリごとに使用するGPG Keyを指定」は、「Enable GPG key signing for commits」にチェック入れれば、登録されているGPG鍵が自動で入るのでチェックいれるだけでいい

  1. 任意の変更を行い、「Commit Options...」 > 「Sign commits」に指定してコミットする。

★ただし、コミット自体は先述したとおり、エラーになってしまうため、現状ではSourcetreeから署名コミットできない。

◆その他

SourcetreeからGPG鍵を使用した署名コミットが、エラーにならずにコミットできる方法をご存知の方は、コメント欄にてご教授いただきますと幸いです。

◆リンク

https://github.com/KZTkotlin/GpgCheck

Discussion

じょにーじょにー

私も同じエラーで SourceTree でコミットできなくて困っていましたが、以下の記事を参考に ~/.gnupg/gpg-agent.confpinentry-program /opt/homebrew/bin/pinentry-mac を追加することで無事コミットできるようになりました。もしよければ参考にしてください。
https://stackoverflow.com/a/59729955