Git のコミットを SSH 鍵で署名する with 1Password
GitHubがSSH鍵によるコミットの署名の検証をサポートしたぜ!
というわけで署名してみる
ドキュメント
やってみた結果
- 割と簡単に署名できた
- GPGより簡単じゃないの?知らんけど
- 1PasswordのSSH Agent使ってる場合は注意
- 設定さえすればいい。設定自体は簡単
- 光り輝く
Verified
がかっこいい
1. 署名用の SSH 鍵を作成
新しく SSH 鍵を作る。
ドキュメント通りssh-keygen -t ed25519 -C "hoge@example.com"
で作成。
パスフレーズ無し。
名前はgit_sign_key
にした。
❯ ssh-keygen -t ed25519 -C "hoge@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/korosuke613/.ssh/id_ed25519): /Users/korosuke613/.ssh/git_sign_key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/korosuke613/.ssh/git_sign_key
Your public key has been saved in /Users/korosuke613/.ssh/git_sign_key.pub
...
2. SSH 鍵を GitHub に登録
- https://github.com/settings/keys を開く
-
New SSH key
をクリック - Title に
git_sign_key on mac
- Key type は
Signing Key
- Key は
pbcopy < ~/.ssh/git_sign_key.pub
でコピーした公開鍵の値を入力 -
Add SSH key
をクリック
追加された。
3. Git の設定
署名のフォーマットをSSHに変更
git config --global gpg.format ssh
公開鍵の中身をコピー
pbcopy < ~/.ssh/git_sign_key.pub
user.signingkey
を更新
git config --global user.signingkey '<公開鍵の中身>'
4. コミットに署名
空コミットを署名してみる。
❯ git commit --allow-empty -S -m "try: commit signing with ssh"
error: Load key "/var/folders/gf/6048_drd30d9d173y3jd61980000gp/T//.git_signing_key_tmpZggrNK": invalid format?
!?
多分 1Password の SSH Agent を有効にしているせい。
3.5 1Password の SSH Agent を使って Git のコミットを署名する
ググったら Beta 版だけどコミットの署名を SSH でやるための方法が載ったドキュメントを発見。
Sign Git commits with SSH (Beta) | 1Password Developer Documentation
Install the 1Password 8 desktop app and make sure you're on the nightly release.
nightly release が必要なのでリリースチャンネルを nightly に設定。
80906004、NIGHTLYチャンネル
になった。
1Password にgit_sign_key
の秘密鍵を登録。
するとNext Step: Sign Your Git Commits
が表示された。
Configure...
をクリックすると設定方法が表示された。
自動で編集してほしくなかったのでCopy Snippet
して~/.gitconfig
に追加。
signingkey
、format
はすでに追加済み。
gpgsign = true
は一旦付与しなかった。
4. コミットに署名 with 1Password
再度コミットに署名するぜ!
-S
をつけてコミット。
git commit --allow-empty -S -m "try: commit signing with ssh"
Touch IDのダイアログが出てきた!
認証したところコミットできた。
❯ git commit --allow-empty -S -m "try: commit signing with ssh"
[commit_sign_with_ssh c1a7eb9] try: commit signing with ssh
GitHubで確認したところVerified
のラベルが!
コミットがSSH鍵で署名され、GitHubが検証してくれてることを確認した。
番外編 手元で署名を確認する
このサイトが参考になった。
署名を確認するにはgit log
に--show-signature
をつける。
❯ git log --show-signature -1 025db5102852f437a989009ad1c1e41a0c540ace
error: gpg.ssh.allowedSignersFile needs to be configured and exist for ssh signature verification
commit 025db5102852f437a989009ad1c1e41a0c540ace
No signature
Author: Futa HIRAKOBA <korosuke613613@gmail.com>
Date: Sat Sep 3 17:26:11 2022 +0900
try: commit signing with ssh
しかし、このままではNo signature
と出てしまう。
信頼してる SSH 公開鍵を登録する必要がある。
信頼リストをgitに設定。
git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
信頼リストを作成。
touch ~/.ssh/allowed_signers
信頼リストに SSH 鍵を登録。メアド メソッド ハッシュ値
という形式っぽい。
echo 'hoge@example.com ssh-ed25519 <ハッシュ値>' > ~/.ssh/allowed_signers
再度見てみる。
Good "git" signature for ...
って出ててエラーっぽいのないからこれで良いっぽい。
❯ git log --show-signature -1 025db5102852f437a989009ad1c1e41a0c540ace
commit 025db5102852f437a989009ad1c1e41a0c540ace (origin/commit_sign_with_ssh, commit_sign_with_ssh)
Good "git" signature for korosuke613613@gmail.com with ED25519 key SHA256:eZvqeOd02bzO1Tz1pTv1mq6KH4z2hGO0BoPhknpqfCE
Author: Futa HIRAKOBA <korosuke613613@gmail.com>
Date: Sat Sep 3 17:26:11 2022 +0900
try: commit signing with ssh
ちなみにGitHubのマージコミットはgpgで署名されているが、公開鍵をローカルで登録していないため検査できないと表示される。
commit d419df23708b14a9e1a2bfc081296d4fc1d290ae
gpg: 土 9/ 3 17:55:12 2022 JSTに施された署名
gpg: RSA鍵4AEE18F83AFDEB23を使用
gpg: 署名を検査できません: No public key
Merge: c66dc99 025db51
Author: Futa HIRAKOBA <korosuke613@users.noreply.github.com>
Date: Sat Sep 3 17:55:12 2022 +0900
Merge pull request #31 from korosuke613/commit_sign_with_ssh
try: commit signing with ssh
ここの方法で登録できた。
$ curl https://github.com/web-flow.gpg | gpg --import
$ gpg --edit-key noreply@github.com
gpg> trust
gpg> save
$ gpg --lsign-key noreply@github.com
4 = 充分に信用する
に設定。
ちなみに https://github.com/web-flow.gpg はドキュメントに載ってる。
GitHub will automatically use GPG to sign commits you make using the web interface. Commits signed by GitHub will have a verified status. You can verify the signature locally using the public key available at https://github.com/web-flow.gpg. The full fingerprint of the key is 5DE3 E050 9C47 EA3C F04A 42D3 4AEE 18F8 3AFD EB23.
https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification#gpg-commit-signature-verification
この鍵は信用できる署名で証明されていません!
と出てしまうが検証自体はできるようになった。
❯ git log --show-signature -1 d419df23708b14a9e1a2bfc081296d4fc1d290ae
commit d419df23708b14a9e1a2bfc081296d4fc1d290ae
gpg: 土 9/ 3 17:55:12 2022 JSTに施された署名
gpg: RSA鍵4AEE18F83AFDEB23を使用
gpg: "GitHub (web-flow commit signing) <noreply@github.com>"からの正しい署名 [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg: この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガープリント: 5DE3 E050 9C47 EA3C F04A 42D3 4AEE 18F8 3AFD EB23
Merge: c66dc99 025db51
Author: Futa HIRAKOBA <korosuke613@users.noreply.github.com>
Date: Sat Sep 3 17:55:12 2022 +0900
Merge pull request #31 from korosuke613/commit_sign_with_ssh
try: commit signing with ssh
5 = 究極的に信用する
にしたら警告出なくなった。
まあGitHubだし究極的に信用してもええやろ!
❯ git log --show-signature -1 d419df23708b14a9e1a2bfc081296d4fc1d290ae
commit d419df23708b14a9e1a2bfc081296d4fc1d290ae
gpg: 土 9/ 3 17:55:12 2022 JSTに施された署名
gpg: RSA鍵4AEE18F83AFDEB23を使用
gpg: "GitHub (web-flow commit signing) <noreply@github.com>"からの正しい署名 [究極]
Merge: c66dc99 025db51
Author: Futa HIRAKOBA <korosuke613@users.noreply.github.com>
Date: Sat Sep 3 17:55:12 2022 +0900
Merge pull request #31 from korosuke613/commit_sign_with_ssh
try: commit signing with ssh