Closed26

Git のコミットを SSH 鍵で署名する with 1Password

Futa HirakobaFuta Hirakoba

GitHubがSSH鍵によるコミットの署名の検証をサポートしたぜ!
https://github.blog/changelog/2022-08-23-ssh-commit-verification-now-supported/

というわけで署名してみる

Futa HirakobaFuta Hirakoba

やってみた結果

  • 割と簡単に署名できた
    • GPGより簡単じゃないの?知らんけど
  • 1PasswordのSSH Agent使ってる場合は注意
    • 設定さえすればいい。設定自体は簡単
  • 光り輝くVerifiedがかっこいい
Futa HirakobaFuta Hirakoba
Futa HirakobaFuta Hirakoba

ドキュメント通り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
...
Futa HirakobaFuta Hirakoba
Futa HirakobaFuta Hirakoba

空コミットを署名してみる。

❯ 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?

!?

Futa HirakobaFuta Hirakoba

3.5 1Password の SSH Agent を使って Git のコミットを署名する

ググったら Beta 版だけどコミットの署名を SSH でやるための方法が載ったドキュメントを発見。

Sign Git commits with SSH (Beta) | 1Password Developer Documentation
https://developer.1password.com/docs/ssh/git-commit-signing/

Futa HirakobaFuta Hirakoba

Install the 1Password 8 desktop app and make sure you're on the nightly release.

nightly release が必要なのでリリースチャンネルを nightly に設定。

80906004、NIGHTLYチャンネルになった。

Futa HirakobaFuta Hirakoba

1Password にgit_sign_keyの秘密鍵を登録。

するとNext Step: Sign Your Git Commitsが表示された。

Futa HirakobaFuta Hirakoba

Configure...をクリックすると設定方法が表示された。

自動で編集してほしくなかったのでCopy Snippetして~/.gitconfigに追加。

signingkeyformatはすでに追加済み。
gpgsign = trueは一旦付与しなかった。

Futa HirakobaFuta Hirakoba

4. コミットに署名 with 1Password

再度コミットに署名するぜ!

Futa HirakobaFuta Hirakoba

-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
Futa HirakobaFuta Hirakoba

番外編 手元で署名を確認する

このサイトが参考になった。

https://calebhearth.com/sign-git-with-ssh

Futa HirakobaFuta Hirakoba

署名を確認するには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と出てしまう。

Futa HirakobaFuta Hirakoba

信頼してる 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
Futa HirakobaFuta Hirakoba

再度見てみる。
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
Futa HirakobaFuta Hirakoba

ちなみに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
Futa HirakobaFuta Hirakoba

ここの方法で登録できた。
https://stackoverflow.com/questions/60482588/what-is-githubs-public-gpg-key

$ 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
Futa HirakobaFuta Hirakoba

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
このスクラップは2022/09/03にクローズされました