GitコミットをGPG署名する方法(Mac+Sourcetree)
現場でGPG署名の設定をする必要があったため、備忘録として記事作成。割と情報が錯綜してわかりにくかったので整理してまとめた。
◆署名するメリット
Gitコミットに紐づく情報は、git config
で管理されているため、git config
で同じメールアドレスを登録すれば、なりすましが容易にできてしまう。
そこで、Gitコミットをデジタル署名(GPG署名)すれば、そのなりすましを防止することが可能。
●偽装方法
リンク参照 > https://qiita.com/s6n/items/bb869f740a53a3bf169e
◆署名方法
●事前準備
■Git設定
git config
の情報を設定する必要がある
- Gitインストール
- Gitのユーザー名を設定する >
git config --global user.name "ユーザー名"
- Gitのメールアドレスを設定する >
git config --global user.email "メールアドレス"
- 2,3の設定が反映されることを確認する >
git config -l
■Homebrewインストール
Homebrew使ってGPGインストールしていくので、先にHomebrewをインストールする
■Sourcetreeインストール
適当にインストール
■確認用Githubリポジトリを作成する
署名できるか確認するために、確認用Githubリポジトリを作成する
●GPGインストール〜GPG鍵設定
- GPGインストール >
brew install gpg pinentry-mac
- 新しいFULL鍵生成する >
gpg --full-generate-key
コマンド押下後の設定は、リンクのQ1~Q6
参照
https://qiita.com/shotakaha/items/65a708f96edbe948eb79
パスフレーズは空欄以外を設定。以降、コミットするときに必要なので必ずメモを取ること!
-
GPG鍵をメモする
生成すると、いろんなメッセージが表示されるが、下記の"鍵のID"がGPG鍵になるので、メモする
pub rsa4096 2019-11-08 [SC] "鍵のID"
-
秘密鍵をPCに出力 >
gpg --export-secret-keys "鍵のID" > privkey.gpg
-
公開鍵をPCに出力 >
gpg --armor --export "鍵のID" > pubkey.gpg
-
GitにGPGの設定をする
git config --global gpg.program "/usr/local/bin/gpg"
git config --global user.signingkey "鍵のID"
git config --global commit.gpgsign true
- 公開鍵をGithubに登録する
- 出力した公開鍵
pubkey.gpg
を、テキストエディタで開いてコピーする - コピーした内容をGithubに登録する
- Githubに登録する方法は、リンクの
Githubに公開鍵を登録しよう
を参照 > https://qiita.com/s6n/items/bb869f740a53a3bf169e
- Githubに登録する方法は、リンクの
-
確認用リポジトリにPushするプロジェクトを作成(なんでもいい)
-
作成プロジェクトを
git init
する -
ステージングにあげて
git add .
署名付きコミットを実行する >git commit -S -m "コミットメッセージ"
※コミットした際にエラーerrro: gpg failed to sign the data
が出てしまうときは、export GPG_TTY=$(tty)
コマンドを実行して、再度コミットする。 -
コミットしたら、確認用リポジトリにPushして、Githubのコミット履歴より、対象コミットが
Verified
が付与されているか確認する
※署名できてないコミットは、Unverified
となる
実際にGithubにPushした画像を下記に記載する。
●補足
登録したGPG鍵情報の確認は、gpg --list-secret-keys --keyid-format LONG
から確認できる。
●Sourcetreeから署名コミットする設定ができない件
下記を設定しても、署名コミット実行しようとしたらエラーが表示されてしまい、コミットできない。
調査してみたところ同様の不具合らしきものが、Sourcetreeの不具合として上がっていて未解決になっている。
ターミナルからのコマンドからは署名コミットできるので、コミットのみターミナルで行い、それ以外の操作をSourcetreeで行うという、併用して使用することで、とりあえず問題は回避できる。
※ターミナルからコミットする方法:git commit -S -m "コミットメッセージ"
(-Sが署名するオプション)。コマンド実行後にパスフレーズを聞かれるので、設定したパスフレーズを入力すると署名コミットされる。
今回は、備忘録として、SourcetreeでGPG鍵を使用するための設定手順だけ下記に記載する。
■SourcetreeでGPG鍵を使用するための設定手順
- 言語設定を英語にすると、Settings > Advanceが表示される(日本語だとなぜか設定できない)
- 日本語は「高度な設定」がdisableされてて選択できない(修正してくれ)
- EnglishでのAdvancedの画面から、GPG Programを設定できる
- リンクの「設定方法」項目の設定を実施 > 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鍵が自動で入るのでチェックいれるだけでいい
- 任意の変更を行い、「Commit Options...」 > 「Sign commits」に指定してコミットする。
★ただし、コミット自体は先述したとおり、エラーになってしまうため、現状ではSourcetreeから署名コミットできない。
◆その他
SourcetreeからGPG鍵を使用した署名コミットが、エラーにならずにコミットできる方法をご存知の方は、コメント欄にてご教授いただきますと幸いです。
◆リンク
Discussion
私も同じエラーで SourceTree でコミットできなくて困っていましたが、以下の記事を参考に
~/.gnupg/gpg-agent.conf
にpinentry-program /opt/homebrew/bin/pinentry-mac
を追加することで無事コミットできるようになりました。もしよければ参考にしてください。