GitHubのコミットは偽装できるらしいので、偽装されないように署名付きコミットにしました。
設定したリポジトリ
下記、リポジトリに設定しました。
【Unity】AdmobのSDKとメディエーションを簡単にインストール
github.com
対象PC
zshのターミナルか確認する
デフォルトはzshなので、変更した覚えが無ければzshを使ってるはずです。
確認手順
アプリケーション > ユーティリティ > ターミナル
を開く- 下記を入力しエンター
$ echo $SHELL
/bin/zsh
と表示されればzsh
設定の流れ
- GitHubにメールアドレスが検証済みか確認
- GPG系ツールのインストール
- GPGキーの生成
- GitHubの
Settings > SSH and GPG keys
に公開キーを設定 - コミットする際にGPG情報を含めるようにSourceTreeを設定
GPGとは?
SSH接続と似ています。PCに秘密キー、GiHubに公開キーを設定します。
コミットする際、GPG署名を含める事でGitHubで検証してくれます。
検証が成功すればVerified
、失敗した場合Unverified
と表示されます。
注意点としては、メールアドレスが正しく設定されている必要があります。
正しく設定する必要があるメールアドレス一覧
下記3つのメールアドレスが一致する必要があります。
※ 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)
下記を入力しエンター
- 本名 : GitHubでのアカウント名を指定 (多分何でも良い)
- 電子メール・アドレス : ※重要 正しく設定する必要があるメールアドレスを指定
- コメント: 空でOK
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