In side head

〜ある技術者の記録〜

SourcetreeでGPGを設定し、GitHubに署名付きコミットをする

GitHubのコミットは偽装できるらしいので、偽装されないように署名付きコミットにしました。

署名付きコミットの場合、Verifiedと表示されます。

設定したリポジトリ

下記、リポジトリに設定しました。
【Unity】AdmobのSDKメディエーションを簡単にインストール github.com

対象PC

zshのターミナルか確認する

デフォルトはzshなので、変更した覚えが無ければzshを使ってるはずです。

確認手順

  • アプリケーション > ユーティリティ > ターミナルを開く
  • 下記を入力しエンター
$ echo $SHELL
  • /bin/zshと表示されればzsh

設定の流れ

  • GitHubにメールアドレスが検証済みか確認
  • GPG系ツールのインストール
  • GPGキーの生成
  • GitHubSettings > SSH and GPG keysに公開キーを設定
  • コミットする際にGPG情報を含めるようにSourceTreeを設定

GPGとは?

SSH接続と似ています。PCに秘密キー、GiHubに公開キーを設定します。
コミットする際、GPG署名を含める事でGitHubで検証してくれます。
検証が成功すればVerified、失敗した場合Unverifiedと表示されます。
注意点としては、メールアドレスが正しく設定されている必要があります。

正しく設定する必要があるメールアドレス一覧

下記3つのメールアドレスが一致する必要があります。

  • コミット時の署名に含まれるメールアドレス
  • GitHubに設定した検証済みのメールアドレス
  • [これから設定] GitHubに登録したGPGキーに設定したメールアドレス

GitHubが用意するGit操作用の匿名メールアドレスは、検証済みメールアドレスとして認識されているのでそのまま使えます。
メールアドレスの例) 49128115+IShix-g@users.noreply.github.com

コミット時の署名に含まれるメールアドレスの確認

Sourcetree上でGPGを設定したいリポジトリを開いて、右上の設定をクリック。

高度な設定で確認できます。

GitHubにメールアドレスが検証済みか確認

右上のプロフィールアイコンをクリック

Settingsをクリック

Emailsをクリック

メールアドレスがUnverifiedの場合、Resend verification emailをクリックして検証してください。GitHubからメールが届きます。

GPG系ツールのインストール

必要なツールをインストールします。

ターミナルを開く

以降の操作はすべてターミナルを使います。 アプリケーション > ユーティリティ > ターミナルを開く。

GPGのインストール

まずインストール済みか確認

$ gpg --version

バージョンが表示されなければ未インストールです。 下記3つをインストールしていきます。

Homebrewがインストール済みか確認

$ brew --version

未インストールの場合、下記を入力しエンター。

Homebrewのインストール

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

GPGとpinentryをインストール

brewコマンドでGPGとpinentryを一度にインストールします。

$ brew install gpg pinentry-mac

インストール確認

念の為確認。バージョンとライセンスが表示されれば完了です。

$ gpg pinentry-mac --version

必要な設定をする

gpg-agentがpinentry-macを使用するように設定。下記を入力しエンター

$ echo 'pinentry-program /opt/homebrew/bin/pinentry-mac' | tee ~/.gnupg/gpg-agent.conf

GPGが現在どの端末から入力を受けるべきかを把握できるように設定。下記を入力しエンター
.zshrcファイルが無い場合、作成してください。

$ if [ -r ~/.zshrc ]; then echo -e '\nexport GPG_TTY=$(tty)' >> ~/.zshrc; \
  else echo -e '\nexport GPG_TTY=$(tty)' >> ~/.zprofile; fi

GPGキーの生成

新しい GPG キーを生成する - GitHub を参考に生成します。

キーの生成

下記を入力しエンター

$ gpg --full-generate-key

ECC (署名と暗号化)がデフォルトなのでそのままエンター

ご希望の鍵の種類を選択してください:
   (1) RSA と RSA
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
   (9) ECC (署名と暗号化) *デフォルト
  (10) ECC (署名のみ)
  (14) カードに存在する鍵
あなたの選択は?

Curve 25519がデフォルトなのでそのままエンター

ご希望の楕円曲線を選択してください:
   (1) Curve 25519 *デフォルト
   (4) NIST P-384
   (6) Brainpool P-256
あなたの選択は?

0 = 鍵は無期限がデフォルトなのでそのままエンター ここは人それぞれで良いと思いますが、個人的にはパスフレーズでロックするので無期限で問題無いと思います。

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

yを入力しエンター

これで正しいですか? (y/N)

下記を入力しエンター

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: IShix-g
電子メール・アドレス: xxxx@ishix.co.jp
コメント: GitHub

確認し、問題無ければO(オー)を入力しエンター

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)?

パスフレーズの入力

  • パスフレーズの入力画面が表示されるので適当に入力
  • Repeatに同じものを入力

パスフレーズは次のテストでキーチェーンに保存するまで一旦テキストエディタなどに保存してください。
※ 制限時間があるので早めに進めてください。

パスフレーズの使用文字や長さは?

半角アルファベットの大文字、小文字、数字を組み合わせて20文字以上で設定。キーチェーンアクセスに保存するので覚える必要はないです。Webで生成できるようにしたので、面倒であればここで。リンク切れ時の対策として下記にコードも置いておきます。

コード

  • test.htmlなど適当なhtmlファイルを作成して下記コードをコピペ
  • ブラウザで開く
<script>
const password = generatePassword(20);
alert(password);

function generatePassword(length) {
    const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    let availableChars = charset.split('');
    let password = "";

    for (let i = 0; i < length; i++) {
        if (availableChars.length === 0) {
            break;
        }
        const randomIndex = Math.floor(Math.random() * availableChars.length);
        password += availableChars[randomIndex];
        availableChars.splice(randomIndex, 1);
    }

    return password;
}
</script>

テスト

問題なく設定されているかテストします。【メールアドレス】 を設定したメールアドレスに変更しエンター。testと表示されれば成功。

$ echo test | gpg -e -r 【メールアドレス】 | gpg -d

パスフレーズを聞かれるので生成したパスフーズを指定。必ずSave in Keychainにチェックが入っているのを確認 してエンター

Gitへ署名キーを伝える (多分必要ない)

Sourcetreeでコミットするなら必要無いと思うので、最終的に問題があれば設定すれば良いと思います。 私は、流れで設定しました。

GitHubに公開キーを設定

公開キーの取得

生成したキーを表示。下記を入力しエンター

$ gpg --list-secret-keys --keyid-format=long

下記のように出力されます。

sec   ed25519/3AA5C34371567BD2 2025-01-13 [SC]
uid                   [  究極  ] IShix-g (GitHub) <xxxx@ishix.co.jp>
ssb   ed25519/4BB6D45482678BE3 2025-01-13

IDで公開キーのエクスポート

上記のIDは3AA5C34371567BD2です。IDを自身のIDに書き換えてエンター

$ gpg --armor --export 3AA5C34371567BD2

成功すれば下記のように出力されます。出力されたものをGitHubにコピペします。

-----BEGIN PGP PUBLIC KEY BLOCK-----

(省略)
-----END PGP PUBLIC KEY BLOCK-----

右上のプロフィール画面をクリック

Settingsをクリック

  • SSH and GPG keysをクリック
  • New GPG keyボタンをクリック

GPG公開キーの登録

  • [Title] 任意、私はPC名を設定しました
  • [Key] 出力した公開キーをコピペ

Add GPG keyで保存してください。

Sourcetreeにパスを通す

SourcetreeでGPGのパスを設定しても無効のエラーが出るのでシンボリックリンクで対応します。

シンボリックリンクを貼る

下記を入力してエンター。パスワードを要求されるのでPCのログインパスワードを入力

$ sudo ln -s /opt/homebrew/opt/gnupg/bin/gpg /usr/local/bin/gpg2

SourcetreeにGPGパスを設定

英語版に切り替え

英語版じゃないと設定できないので英語版に切り替えます。

設定をクリック

メニューバー > Sourcetree > 設定...

言語を変更

English (U.S.)に変更し、Sourcetreeを再起動して言語を反映させます。

Advancedを開く

  • メニューバー > Sourcetree > Settings...で設定を開く
  • Advancedタブをクリック

GPGパスを設定

Browse...ボタンからパスを選択。usr/local/binを指定します。

※ usrディレクトリが表示されていない場合は、Command + Shift + .(ピリオド)で表示できます。

コミット時にGPGキーを含めるように設定

GPGキーの設定は各リポジトリに設定してください。

Settingsをクリック

Sourcetree上でGPGを設定したいリポジトリを開いて、右上のSettingsをクリック。

設定したGPG keyを選択

  • Securityを開く
  • Enable GPG key signing for commitsにチェック
  • Keyをプルダウンから選択

※ 修正できない場合、どこかで間違っています。

設定完了

対象のリポジトリにコミットしてみてください。コミット履歴にVerifiedマークが表示されれば成功です。 それ以外の表記が出る場合は、コミット署名の検証について - GitHub Docsを参考に確認してみてください。

コミット一覧はリポジトリXX Commitsの文字をクリックで開きます。

[おまけ] GPG その他の設定

GPG key IDを取得したい

$ gpg --list-secret-keys --keyid-format=long

下記のGPG key IDは3AA5C34371567BD2です。

sec   ed25519/3AA5C34371567BD2 2025-01-11 [SC]
uid                 [  究極  ] IShix-g (Github) <xxxx@ishix.co.jp>
ssb   cv25519/4BB6D45482678BE3 2025-01-11 [E]

GPGキーを削除したい

【GPG key ID】を書き換えてエンター、何度かyを選択して進めて完了

$ gpg --delete-secret-keys 【GPG key ID】

【GPG key ID】を書き換えてエンター

$ gpg --delete-keys 【GPG key ID】

GPGキーを編集したい

【GPG key ID】を書き換えてエンター

gpg --edit-key 【GPG key ID】

成功すると下記の表記になり、コマンドを入力できるようになるので表からコマンドを指定、もしくはhelpで一覧を表示する事も可能です。

gpg>
コマンド 説明
quit このメニューを終了
save 保存して終了
help このヘルプを表示
fpr 鍵のフィンガープリントを表示
grip keygripを表示
list 鍵とユーザIDの一覧
uid ユーザID Nの選択
key 副鍵Nの選択
check 署名の確認
sign 選択したユーザIDに署名する [* 以下の関連コマンドを参照 ]
lsign 選択したユーザIDにローカルに署名
tsign 選択したユーザIDに信用署名を署名する
nrsign 選択したユーザIDに失効不可の署名をする
adduid ユーザIDの追加
addphoto フォトIDの追加
deluid 選択したユーザIDの削除
addkey 副鍵を追加
addcardkey スマートカードへ鍵の追加
keytocard 鍵をスマートカードへ移動
keytotpm TPM形式にローカルなTPMを使って鍵を変換する
bkuptocard バックアップ鍵をスマートカードへ移動
delkey 選択した副鍵の削除
addrevoker 失効鍵の追加
addadsk 追加の復号用の副鍵を足す
delsig 選択したユーザIDから署名を削除する
expire 鍵または選択した副鍵の有効期限を変更する
primary 選択したユーザIDを主にする
pref 優先指定の一覧 (エキスパート)
showpref 優先指定の一覧 (冗長)
setpref 選択したユーザIDに優先指定リストを設定
keyserver 選択したユーザIDに優先鍵サーバのURLを設定
notation 選択したユーザIDに注釈を設定する
passwd パスフレーズの変更
trust 所有者信用の変更
revsig 選択したユーザIDの署名を失効
revuid 選択したユーザIDの失効
revkey 鍵の失効または選択した副鍵の失効
enable 鍵を有効にする
disable 鍵を無効にする
showphoto 選択したフォトIDを表示
clean 使えないユーザIDをコンパクトにし、使えない署名を鍵から除去
minimize 使えないユーザIDをコンパクトにし、すべての署名を鍵から除去

saveで終了

gpg> save