github.dev 上のコミットは 4AEE18F83AFDEB23 さんが署名している
github.dev (または vscode.dev)でコミットを作成すると GitHub 上で Verified が付くようになっています。
図 1 github.dev でコミットすると GitHub 上で Verified が付く
最初はあまり気にしていなかったのですが、落ち着いて考えてみると「誰が署名してるの?」と気になってきました。
4AEE18F83AFDEB23
さんが署名している
署名に使われた鍵の情報については、とくに捻りもなく Verified をクリックすれば表示されます。
図 1-1 表示された情報
では、この 4AEE18F83AFDEB23
さんは誰なのかというと…。
GitHub は GPG を自動的に使用して、Web インターフェイスで行ったコミットに署名します。 GitHub によって署名されたコミットは、確認済みの状態になります。 https://github.com/web-flow.gpg で入手可能な公開キーを使用して、署名をローカルで確認できます。 キーの完全な指紋は、
5DE3 E050 9C47 EA3C F04A 42D3 4AEE 18F8 3AFD EB23
です。
GitHub (のウェブ)上での操作により作成されたコミットなどに署名する鍵とのことです。他には Pull Request で Merge Commit を作るときでも使われているようです。
なお、調べてみた限りでは、署名させない設定などはなさそうでした。
ローカルで確認してみる
上記の鍵に限った話でもないのですが、「GitHub で Verified になっているのはよいけど、ローカルで検証ってどうやるの?」と思っていたので試しに署名を確認してみます。
確認は下記のリポジトリを clone して行います(冒頭のスクリーンショットに使ったリポジトリです)。また、GPG の homedir
は一時的に作ったものを利用しています。
まず、準備なしで $ git log --show-signature
を実行してみます。
図 2-1 公開鍵がないので検査(確認)できない
対応のために公開鍵を追加してみます。
といきたいところですが、いきなり追加するのもアレなのでいちおう事前に確認してみます。今回は下記の記事で紹介されている gpgpdump
を利用してみます。
図 2-2 鍵の内容と指紋を確認
$ ./gpgpdump github web-flow --keyid 4AEE18F83AFDEB23 -u
Public-Key Packet (tag 6) (269 bytes)
Version: 4 (current)
Public key creation time: 2017-08-16T15:44:01Z
Public-key Algorithm: RSA (Encrypt or Sign) (pub 1)
RSA public modulus n (2048 bits)
RSA public encryption exponent e (17 bits)
User ID Packet (tag 13) (53 bytes)
User ID: GitHub (web-flow commit signing) <noreply@github.com>
Signature Packet (tag 2) (290 bytes)
Version: 4 (current)
Signiture Type: Positive certification of a User ID and Public-Key packet (0x13)
Public-key Algorithm: RSA (Encrypt or Sign) (pub 1)
Hash Algorithm: SHA2-256 (hash 8)
Hashed Subpacket (22 bytes)
Signature Creation Time (sub 2): 2017-08-16T15:44:01Z
Issuer (sub 16): 0x4aee18f83afdeb23
Key Flags (sub 27) (1 bytes)
Flag: This key may be used to certify other keys.
Flag: This key may be used to sign data.
Primary User ID (sub 25): Primary (1 bytes)
Hash left 2 bytes
99 01
RSA signature value m^d mod n (2048 bits)
$ ./gpgpdump github web-flow --keyid 4AEE18F83AFDEB23 --raw | gpg --show-keys
pub rsa2048 2017-08-16 [SC]
5DE3E0509C47EA3CF04A42D34AEE18F83AFDEB23
uid GitHub (web-flow commit signing) <noreply@github.com>
確認できたのでインポートと署名をしておきます。
図 2-3 インポートと署名
$ gpg --fetch-keys https://github.com/web-flow.gpg
gpg: 鍵を'https://github.com/web-flow.gpg'から要求
gpg: 鍵4AEE18F83AFDEB23: 公開鍵"GitHub (web-flow commit signing) <noreply@github.com>"をインポートしました
gpg: 処理数の合計: 1
gpg: インポート: 1
$ gpg --edit-key 4AEE18F83AFDEB23 trust quit
gpg (GnuPG) 2.2.40; Copyright (C) 2022 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
gpg: 信用データベースの検査
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
gpg: 次回の信用データベース検査は、2024-12-15です
pub rsa2048/4AEE18F83AFDEB23
作成: 2017-08-16 有効期限: 無期限 利用法: SC
信用: 充分 有効性: 不明の
[ 不明 ] (1). GitHub (web-flow commit signing) <noreply@github.com>
pub rsa2048/4AEE18F83AFDEB23
作成: 2017-08-16 有効期限: 無期限 利用法: SC
信用: 充分 有効性: 不明の
[ 不明 ] (1). GitHub (web-flow commit signing) <noreply@github.com>
他のユーザの鍵を正しく検証するために、このユーザの信用度を決めてください
(パスポートを見せてもらったり、他から得たフィンガープリントを検査したり、などなど)
1 = 知らない、または何とも言えない
2 = 信用し ない
3 = まぁまぁ信用する
4 = 充分に信用する
5 = 究極的に信用する
m = メーン・メニューに戻る
あなたの決定は? 4
pub rsa2048/4AEE18F83AFDEB23
作成: 2017-08-16 有効期限: 無期限 利用法: SC
信用: 充分 有効性: 不明の
[ 不明 ] (1). GitHub (web-flow commit signing) <noreply@github.com>
$ gpg --lsign 4AEE18F83AFDEB23
pub rsa2048/4AEE18F83AFDEB23
作成: 2017-08-16 有効期限: 無期限 利用法: SC
信用: 充分 有効性: 不明の
[ 不明 ] (1). GitHub (web-flow commit signing) <noreply@github.com>
pub rsa2048/4AEE18F83AFDEB23
作成: 2017-08-16 有効期限: 無期限 利用法: SC
信用: 充分 有効性: 不明の
主鍵フィンガープリント: 5DE3 E050 9C47 EA3C F04A 42D3 4AEE 18F8 3AFD EB23
GitHub (web-flow commit signing) <noreply@github.com>
本当にこの鍵にあなたの鍵"hankei6km <gh-hankei6km@outlook.jp>"で署名してよいですか
(B28DC515982DFE08)
署名は、エクスポート不可に設定されます。
本当に署名しますか? (y/N) y
準備できたので再度 $ git log --show-signature
を実行してみます。
図 2-4 署名を確認できる
GitHub 上から鍵をインポートすることで署名を確認できました。ただし、あくまでも web-flow
が署名したと確認できるだけなので、GitHub 上で Verified 扱いになるかはぱっと見で判定が難しいような気もしています。
Codespaces の場合
Codespaces の場合は設定から web-flow
による署名の有無を切り替えることができます(デフォルトでは無しです)
試してみると専用の署名用プログラム(だと思われる)を Git の設定に指定しているので、ターミナルでの操作でも署名されるようになっています。ただし、$ git log --show-signature
で確認すると公開鍵がないので検査できない状態になります。
おわりに
github.dev で作成したコミットの署名について、誰が署名しているのか確認してみました。
とくに設定しなくとも Verified になるのは便利なような気もしますが、GitHub の外で使う(確認する)となると少し面倒なこともありそうです。
他にも警戒モードなど GitHub での枠組みがあるようなので、必要に応じて調べていこうかと思っています。
Discussion