Closed28

署名付きコミットの設定方法

りすりす

まず、gpg --quick-gen-key "名前 <メール>" future-default - 0
future-default は以下の記事(元記事の参照)にある通り、ECC (楕円曲線暗号) という RSA より新しい暗号を使う
https://text.baldanders.info/openpgp/using-ecc-with-gnupg/

また、<> は必須、ないとメールアドレスが認識されない

- はデフォルトの usage (権限) を表す、主鍵は SC, 副鍵は E

0 は有効期限無限を示す

りすりす

そもそも、すべて Git Bash で実行する (Windows ターミナルから開ける)

りすりす

GitHub で noreply の場合は unverified が出なくなってた

りすりす

または、サブキーを設定するときは、! サフィックスを含めます。 この例の GPG サブキー ID は 4BB6D45482678BE3 です。

こう書いてあるが、サブキーでも ! はつけない。つけると動かない

gpg: skipped "85BD3E83E30917F3!": Unusable secret key
gpg: signing failed: Unusable secret key
error: gpg failed to sign the data
fatal: failed to write commit object

https://docs.github.com/ja/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key

りすりす

gpg.program は指定する必要がない
commit.gpgsign は true にしておくと常に署名してくれる

りすりす

git config --global add commit.gpgsign trueadd がオプションなので、--add でないと動かない
また、そもそも --add はいらなさそう

りすりす

user.name, user.email は GitHub Desktop が設定してくれている
これは、gpg で鍵を作成したときのと一致する必要がある、はず
GitHub Desktop > File > Options > Git からも確認できる
git config --global --edit でファイルとしてコンフィグを開いて確認できる

りすりす

間違えて鍵を作成したときは、gpg --delete-secret-keys 050AF3BD7D83A93B61AE621F4D7F6C103A545A7D => gpg --delete-keys 050AF3BD7D83A93B61AE621F4D7F6C103A545A7D で消せる

$ gpg --list-secret-keys --keyid-format=long
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
/c/Users/takua/.gnupg/pubring.kbx
---------------------------------
sec   rsa4096/4D7F6C103A545A7D 2023-12-24 [SC]
      050AF3BD7D83A93B61AE621F4D7F6C103A545A7D
uid                 [ultimate] risu729 <79110363+risu729@users.noreply.github.com>
ssb   rsa4096/EAFC22F79BC418BF 2023-12-24 [E]
りすりす

こんな感じのGUIがコミット時に出てパスフレーズを求められる
空にもできるが非推奨。ただ、毎回入力が必要なのであんまり面倒なのはやめたほうがいい

りすりす

サブキーに S (Sign) 権限を与えないとダメな気がする

error: gpg failed to sign the data
fatal: failed to write commit object

サブキー (副鍵) に、cv25519 を使っていた (future-default (= cv25519/ed25519)) ので、暗号化しかできなく、権限を変更しようとしてもエラーを吐いていた
副鍵もed25519 にしないと、S 権限は与えられない、つまり Git の認証には使えないっぽい?

Invalid selection.

Possible actions for a ECDH key: Encrypt

https://text.baldanders.info/openpgp/gnupg-cheat-sheet/

アルゴリズムの違いはなんかあった
https://crypto.stackexchange.com/questions/27866/why-curve25519-for-encryption-but-ed25519-for-signatures

りすりす

話変わるけど winget でインストールできるらしい、git bash よりよさげ
winget install gnupg (gpg じゃない!!!)
PATH が更新されるのでターミナルを開きなおす

りすりす

主鍵に certify, 副鍵に sign を与えればいいっぽい?

りすりす

なんでWindowsだと E だけの副鍵でコミットできるんだろう???

りすりす

多分これだ
間違った方法で指定したおかげで認証できたが、正しく指定したらfallbackしないので認証できなかったということっぽい
ただ、Windows で fallback して WSL で fallback しなかったのは謎。どっちも鍵1つしか作ってなかったのに
https://zenn.dev/kariya_mitsuru/articles/6705bbb4106013

りすりす

git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe" が必要
これがないと git bash の方の gpg が使われてエラーを吐いた

りすりす
 gpg --quick-gen-key "risu729 <79110363+risu729@users.noreply.github.com>" ed25519 cert 0
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
gpg: C:\\Users\\takua\\AppData\\Roaming\\gnupg\\trustdb.gpg: 信用データベースができました
gpg: ディレクトリ'C:\\Users\\takua\\AppData\\Roaming\\gnupg\\openpgp-revocs.d'が作成されました
gpg: 失効証明書を 'C:\\Users\\takua\\AppData\\Roaming\\gnupg\\openpgp-revocs.d\\0F1554453F57D98DA407B62BC574E3AFA17B1AC4.rev' に保管しました。
公開鍵と秘密鍵を作成し、署名しました。

pub   ed25519 2023-12-24 [C]
      0F1554453F57D98DA407B62BC574E3AFA17B1AC4
uid                      risu729 <79110363+risu729@users.noreply.github.com>

PS C:\Users\takua> gpg --quick-add-key 0F1554453F57D98DA407B62BC574E3AFA17B1AC4 ed25519 sign
gpg: 信用データベースの検査
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
PS C:\Users\takua> gpg --list-secret-keys --keyid-format long
[keyboxd]
---------
sec   ed25519/C574E3AFA17B1AC4 2023-12-24 [C]
      0F1554453F57D98DA407B62BC574E3AFA17B1AC4
uid                 [  究極  ] risu729 <79110363+risu729@users.noreply.github.com>
ssb   ed25519/2FAA61F77E6AB1E3 2023-12-24 [S]

PS C:\Users\takua> gpg --armor --export 0F1554453F57D98DA407B62BC574E3AFA17B1AC4
-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEZYgARhYJKwYBBAHaRw8BAQdAGTkLlBk5OFQIlm37jbGNi6/xskMea95xAwA3
iFK3aza0M3Jpc3U3MjkgPDc5MTEwMzYzK3Jpc3U3MjlAdXNlcnMubm9yZXBseS5n
aXRodWIuY29tPoiTBBMWCgA7FiEEDxVURT9X2Y2kB7YrxXTjr6F7GsQFAmWIAEYC
GwEFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQxXTjr6F7GsQzlgEAi5KP
n673eRo40BK9Fdyi6wm5F2InenCyZH4HSUM69lsA/jlvnex35SywKsPJ01MTW55N
4WS5AYnyj03kyzu9sHMMuDMEZYgDaBYJKwYBBAHaRw8BAQdAzqyfD1R7lB3FEeNG
ROlO7j2Z+kzzxiqw1Hu+OH7TMhOI7wQYFgoAIBYhBA8VVEU/V9mNpAe2K8V046+h
exrEBQJliANoAhsCAIEJEMV046+hexrEdiAEGRYKAB0WIQRgUYVUWKDcwuGC2R0v
qmH3fmqx4wUCZYgDaAAKCRAvqmH3fmqx4/zeAQCEhYFmA3WNumsroNeytS8xNjRI
04D7LMRExw/kVmaxBgD/S1kPFBiduJ4OD0f0YAW+FDU963AVZb/4TeVXs2tylQdg
DwD/YLOT8GrJuTs6Wt0DNo77slMt+VtxuxdzDODw0IX+Lq8A/j1rM1rJ3vF/0Px/
RrCslwC78xPCrAH0YTUhtbVPGEgC
=SZDE
-----END PGP PUBLIC KEY BLOCK-----
PS C:\Users\takua> git config --global user.signingkey 2FAA61F77E6AB1E3!
PS C:\Users\takua> git config --global gpg.program "C:\Program Files (x86)\GnuPG\bin\gpg.exe"
りすりす
risu@risu-windows:~$ gpg --quick-gen-key "risu729 <79110363+risu729@users.noreply.github.com>" ed25519 cert 0
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key 4C4948BF724B5CCB marked as ultimately trusted
gpg: revocation certificate stored as '/home/risu/.gnupg/openpgp-revocs.d/E5A05D3BCCB6E976F33343F84C4948BF724B5CCB.rev'
public and secret key created and signed.

pub   ed25519 2023-12-24 [C]
      E5A05D3BCCB6E976F33343F84C4948BF724B5CCB
uid                      risu729 <79110363+risu729@users.noreply.github.com>

risu@risu-windows:~$ gpg --quick-add-key E5A05D3BCCB6E976F33343F84C4948BF724B5CCB ed25519 sign
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
risu@risu-windows:~$  gpg --list-secret-keys --keyid-format long
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
/home/risu/.gnupg/pubring.kbx
-----------------------------
sec   ed25519/4C4948BF724B5CCB 2023-12-24 [C]
      E5A05D3BCCB6E976F33343F84C4948BF724B5CCB
uid                 [ultimate] risu729 <79110363+risu729@users.noreply.github.com>
ssb   ed25519/96DE8C178AE48795 2023-12-24 [S]

risu@risu-windows:~$ gpg --armor --export E5A05D3BCCB6E976F33343F84C4948BF724B5CCB
-----BEGIN PGP PUBLIC KEY BLOCK-----

mDMEZYgIGhYJKwYBBAHaRw8BAQdA55A48GTYCKC0NiloN0d/PIdVKt2qof8r40Oo
RRN/prO0M3Jpc3U3MjkgPDc5MTEwMzYzK3Jpc3U3MjlAdXNlcnMubm9yZXBseS5n
aXRodWIuY29tPoiQBBMWCAA4FiEE5aBdO8y26XbzM0P4TElIv3JLXMsFAmWICBoC
GwEFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQTElIv3JLXMt/aAEAxcVJehsK
Amy3ReIysmm2AjFT0YEa2y1w4czGd9/VchwBAK2GPQ4VgTmwMaGd273x4lAydusW
OvWIg5e6jXjuPVcIuDMEZYgIWxYJKwYBBAHaRw8BAQdAeIEwp0v+dUCuu/0schST
8MzYkdOU7VTS7/VPZ1Pph7eI7wQYFggAIBYhBOWgXTvMtul28zND+ExJSL9yS1zL
BQJliAhbAhsCAIEJEExJSL9yS1zLdiAEGRYIAB0WIQQkFIWmhIPTQ99XCa+W3owX
iuSHlQUCZYgIWwAKCRCW3owXiuSHlRrLAP97/XzvBIFssKxCI3H58nVha06MFTzn
Z5scgox2pB1YhAD7B3mUCJOe3kxiOCrUCKJhgQVpkYGMCZ+R6SELVgRs9guStgD/
e5Zk+IofGX/hNZODheVhiFg23ZbW4dhyr08kyH2MGIoA/2P696J3OghxzfExEpYq
AOu42SW0f8iTJjHDFSzS1+IE
=vVpq
-----END PGP PUBLIC KEY BLOCK-----
risu@risu-windows:~$ git config --global user.signingkey 96DE8C178AE48795!
りすりす

.bashrc の末尾に export GPG_TTY=$(tty) を追記した
.bash_profile でも問題ないはずだが、なんかWSLだと無かったので

りすりす

署名付きコミット、できた!!!

このスクラップは2023/12/24にクローズされました