Ubuntu

GiteaでGPGキーを取り扱う

DockerでGiteaを動かす記事を書いてみたけれど、GPGキーについて何も試していなかったことに気が付いた。
そこで、GPGキーをちゃんと使えるように、取り扱いを整理してみることにした。



広告


ちゃんと使おうと思うと、やることが多かった。
操作は Ubuntu 22.04 LTS Server で行っている。

GPGキー

Wikipediaによれば…

GNU Privacy Guard (GnuPG, GPG) とは、Pretty Good Privacy (PGP) の別実装として、GPL に基づいた暗号化ソフトである。

Wikipedia / GNU Privacy Guard

ということで、恐らくGPGキーというのは、この暗号化に使用する秘密鍵・公開鍵のことを指しているものと思われる。

GPGキーでの署名について、Git bookで教えてくれている。

Git の仕組みは暗号学の点から見れば堅牢です。しかし、容易には得られません。インターネットを使って貢献を受け付けているとしましょう。受け付けた内容が信頼できる筋からのものかどうか調べたいときに、署名の付与・検証をGPG を使っておこなう複数の仕組みが Git にはあります。

Git book / 7.4 Git のさまざまなツール – 作業内容への署名

Githubではコミット署名の検証GPGキーの生成アカウントへの登録、署名の仕方など、様々な説明をしてくれている。

そして、調べている中でサブキーの存在を知り、それをとても詳しく教えてくれていたのがDebian Wiki。
これを見ると、サブキーを含めた鍵の管理ができるようになって、初めて整理できたといえるのかなと考えるに至った。
Debian / Wiki / Subkeys / Using OpenPGP subkeys in Debian development

GPGキーの取り扱い

調べながら色々やってみた結果として、GPGキーを以下のように取り扱うことにした。

  • 秘密鍵のプライマリーキーには、強力なパスフレーズを設定する。
  • 署名に使うサブキーを作成し、パスフレーズなしに設定する。
  • Gitでは署名用のサブキーを利用するように設定する。
  • Giteaには、プライマリーキーの公開鍵(普段使いのサブキー情報を含む)を登録。

別にパスフレーズなしで運用しなくても、普段使い用のパスフレーズを設定することも可能で、その方が安全度は高いかもしれない。

今回、まっさらな状態からはじめるので、以下を順番にやっていく。

  • 新しいキーペアを作成する。秘密鍵と公開鍵ができる。
  • 秘密鍵のサブキーを作成する。
  • 秘密鍵のプライマリーキーをエクスポートして大切に保管し、キーリングから外しておく。
  • GitやGiteaに必要な情報を登録して、署名を使ってみる。

新しいキーペアの作成

こちらで教えてくれたやり方で、新しいキーペアを作成する。
Github docs / 新しい GPG キーを生成する

コマンドを実行すると対話式で、質問に答えていけばキーペアが作成できる。

  • 名前は本名とされているが、利用する範囲を考慮し、その範囲で通用するニックネームを入力した。
  • メールアドレスも同様に、利用する範囲で使いたいメールアドレスを入力した。
  • コメントは特になかったのでホームページのURLを入れてみたが、何も入力しなくても問題はない。
$ gpg --full-generate-key
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: directory '/home/rohhie/.gnupg' created
gpg: keybox '/home/rohhie/.gnupg/pubring.kbx' created
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
  (14) Existing key from card
Your selection? [Enter]
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096[Enter]
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) [Enter]
Key does not expire at all
Is this correct? (y/N) y[Enter]

GnuPG needs to construct a user ID to identify your key.

Real name: rohhie[Enter]
Email address: rohhie@rohhie.net[Enter]
Comment: https://rohhie.net[Enter]
You selected this USER-ID:
    "rohhie (https://rohhie.net) <rohhie@rohhie.net>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O[Enter]

ここで、パスフレーズの入力を求められたので、超強力なパスフレーズを入力。

╔══════════════════════════════════════════════════════╗
║ Please enter the passphrase to                       ║
║ protect your new key                                 ║
║                                                      ║
║ Passphrase: ________________________________________ ║
║                                                      ║
║       <OK>                              <Cancel>     ║
╚══════════════════════════════════════════════════════╝

確認入力で、同じパスフレーズを入力。

╔══════════════════════════════════════════════════════╗
║ Please re-enter this passphrase                      ║
║                                                      ║
║ Passphrase: ________________________________________ ║
║                                                      ║
║       <OK>                              <Cancel>     ║
╚══════════════════════════════════════════════════════╝

GPGのキーペアが生成された。

gpg: /home/rohhie/.gnupg/trustdb.gpg: trustdb created
gpg: key D8404F66204D42D3 marked as ultimately trusted
gpg: directory '/home/rohhie/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/rohhie/.gnupg/openpgp-revocs.d/E056E8499A54182ED6EDD3C9D8404F66204D42D3.rev'
public and secret key created and signed.

pub   rsa4096 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid                      rohhie (https://rohhie.net) <rohhie@rohhie.net>
sub   rsa4096 2022-09-26 [E]

ここにGPGキーのデーターベースらしきファイルが生成されている。

$ ll ~/.gnupg/
total 28
drwx------  4 rohhie rohhie 4096 Sep 26 21:56 ./
drwxr-x--- 17 rohhie rohhie 4096 Sep 26 21:31 ../
drwx------  2 rohhie rohhie 4096 Sep 26 21:56 openpgp-revocs.d/
drwx------  2 rohhie rohhie 4096 Sep 26 21:56 private-keys-v1.d/
-rw-rw-r--  1 rohhie rohhie 2489 Sep 26 21:56 pubring.kbx
-rw-------  1 rohhie rohhie   32 Sep 26 21:56 pubring.kbx~
-rw-------  1 rohhie rohhie 1240 Sep 26 21:56 trustdb.gpg

鍵の情報は以下で表示できる。

$ gpg --list-public-keys --keyid-format long
/home/rohhie/.gnupg/pubring.kbx
-------------------------------
pub   rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid                 [ultimate] rohhie (https://rohhie.net) <rohhie@rohhie.net>
sub   rsa4096/C95010EF5797F3C6 2022-09-26 [E]

$ 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/rohhie/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid                 [ultimate] rohhie (https://rohhie.net) <rohhie@rohhie.net>
ssb   rsa4096/C95010EF5797F3C6 2022-09-26 [E]

表示内容についてsecとssbとは何か、ここで教えてくれた。
superuser / What do ‘ssb’ and ‘sec’ mean in gpg’s output?

sec => ‘SECret key’
ssb => ‘Secret SuBkey’
pub => ‘PUBlic key’
sub => ‘public SUBkey’

INTO THE VOID / Creating a new GPG key with subkeys

SCやEはこちらで教えてくれているけれども、それぞれを組み合わせてみると、こういったことかと。
Unix&Linux / How are the GPG usage flags defined in the key details listing?

設定内容意味
EencryptionThis key may be used to encrypt communications.
SsigningThis key may be used to sign data.
CcertificationThis key may be used to certify other keys.
AauthenticationThis key may be used for authentication.

署名用のサブキーを作成

署名ができるサブキーを作成し、署名までを試してみる。

サブキーを作成

秘密鍵のIDを確認。

$ 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/rohhie/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid                 [ultimate] rohhie (https://rohhie.net) <rohhie@rohhie.net>
ssb   rsa4096/C95010EF5797F3C6 2022-09-26 [E]

秘密鍵の編集を開始し、署名だけができる鍵を追加する。

$ gpg --edit-key D8404F66204D42D3

gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa4096/C95010EF5797F3C6
     created: 2022-09-26  expires: never       usage: E
[ultimate] (1). rohhie (https://rohhie.net) <rohhie@rohhie.net>

gpg> addkey[Enter]

Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
  (14) Existing key from card
Your selection? 4[Enter]
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096[Enter]
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) [Enter]
Key does not expire at all
Is this correct? (y/N) y[Enter]
Really create? (y/N) y[Enter]

最初に作ったキーペアのパスフレーズを入力。

╔═══════════════════════════════════════════════════════════════╗
║ Please enter the passphrase to unlock the OpenPGP secret key: ║
║ "rohhie (https://rohhie.net) <rohhie@rohhie.net>"             ║
║ 4096-bit RSA key, ID D8404F66204D42D3,                        ║
║ created 2022-09-26.                                           ║
║                                                               ║
║                                                               ║
║ Passphrase: _________________________________________________ ║
║                                                               ║
║         <OK>                                   <Cancel>       ║
╚═══════════════════════════════════════════════════════════════╝

サブキーが作成できたので、終了する。

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.

sec  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa4096/C95010EF5797F3C6
     created: 2022-09-26  expires: never       usage: E
ssb  rsa4096/68E65F88C02F927A
     created: 2022-09-30  expires: never       usage: S
[ultimate] (1). rohhie (https://rohhie.net) <rohhie@rohhie.net>

gpg> save[Enter]

サブキーで署名を試す

サブキーを使った署名を試してみる。

$ gpg -sau 68E65F88C02F927A
aiueo[Enter]
[Ctrl]+[d]

秘密鍵のパスフレーズを求められるので入力すると、メッセージ(ここではaiueo)に署名される。

-----BEGIN PGP MESSAGE-----

owEBUwKs/ZANAwAKAWjmX4jAL5J6AcsMYgBjN3UEYWl1ZW8KiQIzBAABCgAdFiEE
53Ah/QV8dCBQn+pJaOZfiMAvknoFAmM3dQcACgkQaOZfiMAvknoBkxAAl9XKvTC6
YtjbzY9V9dmKuXMwAB9NWjPTlkKpMw0kwSjDekimfTrMzizsfF5mdnnagtQKyuGv
hXwozswV4exd9gIw/+zM8qNK5XQgwkeS30fYGWA7uIZovkbkRhdm+xv9gH9yT76i
R9v3PVxeFHb76qoao7Q0Rcf8L60BhqIcgUpyo6XrCnFuH9zUPM4BieAr571Zjxqr
Rsm/OB43eQHiq7geRI0D9rY0bxIx/D1vKIcluN0A6AvRwl4x+O3fW0lxFy0TNU8J
3M9yOJeZm7DTLW7lnN2MQG3zfYFVd2fMNA+RRjJe+DOzakQ+KbVHS+H+DUEv4FAR
CpxrLjUTn9aCZJ34yrpLF9v87JGCU+UDty64jauUvqmnhzjjCz97m9M8dmuZlChO
R7EFQxaH7ARwC05cpR2TeuD9lnrR76iqRR2XmJ5HOBnMGTjYHSFEDdVVbpknIBaM
2WrJHnNydPUoFnZ4YEiPXx5muCuWzzqNTzmF22qyQID7hzrF5At4a6AXeg3AoU+V
90Pxxk9KoU/bp74CwqrYtJ2qF61DnVQuf04WwtRo1l6TdtJtKvwggPi8qCh0w+74
7PwFeItELZaiXvOlaBvYgPvDXmtNQWvh/uVR9PUbUyua5C6s8Xieo1Br2mkTecKC
q6ldKaJQQglg3t3/ZeRCb47qpiqm80UPmLw=
=kZja
-----END PGP MESSAGE-----

これをコピーして、複合化してみる。

$ gpg -d
※ここにペースト
-----BEGIN PGP MESSAGE-----
…
-----END PGP MESSAGE-----
[Ctrl]+[d]
aiueo
gpg: Signature made Sat Oct  1 08:00:23 2022 JST
gpg:                using RSA key E77021FD057C7420509FEA4968E65F88C02F927A
gpg: Good signature from "rohhie (https://rohhie.net) <rohhie@rohhie.net>" [ultimate]

サブキーで署名されていることを確認する。

$ gpg --list-secret-keys --keyid-format long --with-subkey-fingerprint
/home/rohhie/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid                 [ultimate] rohhie (https://rohhie.net) <rohhie@rohhie.net>
ssb   rsa4096/C95010EF5797F3C6 2022-09-26 [E]
      339A8B7A463DB3DD1F66AD5DC95010EF5797F3C6
ssb   rsa4096/68E65F88C02F927A 2022-09-30 [S]
      E77021FD057C7420509FEA4968E65F88C02F927A

サブキーで署名していることを確認できた。

秘密鍵を整理

ここで、秘密鍵(最初に作成したキーペア=プライマリーキー、デフォルトで作られるサブキー、署名用に作成したサブキーを含む)をエクスポートして、大切に保管する。
その上で、キーリングからプライマリーキー、デフォルトで作られるサブキーを削除する。

最後に署名用のサブキーのパスフレーズを解除、あるいは、日常使いのパスフレーズに変更する。

秘密鍵を大切に保管

秘密鍵をエクスポートする。
この操作で、プライマリーキーだけでなく、サブキーもあわせてエクスポートされる。

$ gpg --output primary-secretkey --armor --export-secret-key D8404F66204D42D3

パスフレーズを求められるので入力。

╔═══════════════════════════════════════════════════════════════╗
║ Please enter the passphrase to unlock the OpenPGP secret key: ║
║ "rohhie (https://rohhie.net) <rohhie@rohhie.net>"             ║
║ 4096-bit RSA key, ID D8404F66204D42D3,                        ║
║ created 2022-09-26.                                           ║
║                                                               ║
║                                                               ║
║ Passphrase: _________________________________________________ ║
║                                                               ║
║         <OK>                                   <Cancel>       ║
╚═══════════════════════════════════════════════════════════════╝

ファイルprimary-secretkeyに秘密鍵が保管された。
インポートする際は、この時に設定されているパスフレーズ(今までの手順で行けば、キーペアを作った時のパスフレーズ)の入力が必要。
これを大切に保管する。

キーリングからプライマリーキーを削除

プライマリーキーを保管できたので、キーリングから削除する。

削除する際はフィンガープリントを指定することになっていた。
また、フィンガープリントの最後に!を付けないと、サブキーも一通り削除するか確認されるので、!を付けている。

$ gpg --delete-secret-keys E056E8499A54182ED6EDD3C9D8404F66204D42D3!
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


sec  rsa4096/D8404F66204D42D3 2022-09-26 rohhie (https://rohhie.net) <rohhie@rohhie.net>

Note: Only the secret part of the shown primary key will be deleted.

Delete this key from the keyring? (y/N) y[Enter]
This is a secret key! - really delete? (y/N) y[Enter]

ここで、最終確認の画面が表示されるので、Delete keyを選択する。

╔══════════════════════════════════════════════════════════════════╗
║ Do you really want to permanently delete the OpenPGP secret key: ║
║ "rohhie (https://rohhie.net) <rohhie@rohhie.net>"                ║
║ 4096-bit RSA key, ID D8404F66204D42D3,                           ║
║ created 2022-09-26.                                              ║
║ ?                                                                ║
║                                                                  ║
║     <Delete key>                                    <No>         ║
╚══════════════════════════════════════════════════════════════════╝

秘密鍵を表示させると、プライマリーキーが使用できなくなっていることが分かる。

$ gpg --list-secret-keys --keyid-format long -with-subkey-fingerprint --with-keygrip
/home/rohhie/.gnupg/pubring.kbx
-------------------------------
sec#  rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
      Keygrip = 584D9A3CA2BAE651092F5075D2CAF41E611B5A14
uid                 [ultimate] rohhie (https://rohhie.net) <rohhie@rohhie.net>
ssb   rsa4096/C95010EF5797F3C6 2022-09-26 [E]
      339A8B7A463DB3DD1F66AD5DC95010EF5797F3C6
      Keygrip = 9D8ED7488CBE9382437EB57605840EC384939CC5
ssb   rsa4096/68E65F88C02F927A 2022-09-30 [S]
      E77021FD057C7420509FEA4968E65F88C02F927A
      Keygrip = 3E9BC6B08B93A695EC043D79B288A00D03246856

秘密鍵は、キーグリップの名前で保管されているそうなので、それが削除されていることを確認してみる。

$ ll ~/.gnupg/private-keys-v1.d/
total 16
drwx------ 2 rohhie rohhie 4096 Oct  1 01:55 ./
drwx------ 3 rohhie rohhie 4096 Oct  1 01:56 ../
-rw------- 1 rohhie rohhie 4025 Oct  1 01:33 3E9BC6B08B93A695EC043D79B288A00D03246856.key
-rw------- 1 rohhie rohhie 4025 Oct  1 01:33 9D8ED7488CBE9382437EB57605840EC384939CC5.key

これで、プライマリーキーは作業環境からなくなったので、安心と言えそうだ。

さて…Gitでは署名でしかGPG鍵を使わないようなので、最初に作られた暗号化に使われるであろう鍵も削除しておく。

$ gpg --delete-secret-keys 339A8B7A463DB3DD1F66AD5DC95010EF5797F3C6!

これで、署名で使用するサブキーだけが有効な状態になった。

サブキーのパスフレーズを解除

サブキーのパスフレーズを解除する。あるいは、日常使いのパスフレーズに変更する。

$ gpg --change-passphrase 68E65F88C02F927A

現在のパスフレーズを入力する。

╔═══════════════════════════════════════════════════════════════╗
║ Please enter the passphrase to unlock the OpenPGP secret key: ║
║ "rohhie (https://rohhie.net) <rohhie@rohhie.net>"             ║
║ 4096-bit RSA key, ID 68E65F88C02F927A,                        ║
║ created 2022-09-30 (main key ID D8404F66204D42D3).            ║
║                                                               ║
║                                                               ║
║ Passphrase: ********************************_________________ ║
║                                                               ║
║         <OK>                                   <Cancel>       ║
╚═══════════════════════════════════════════════════════════════╝

新しいパスフレーズを求められるので、何も入力せずにエンターキーを押す。
ここで、日常使いのパスフレーズを入力しても良い。

╔══════════════════════════════════════════════════════╗
║ Please enter the new passphrase                      ║
║                                                      ║
║ Passphrase: ________________________________________ ║
║                                                      ║
║       <OK>                              <Cancel>     ║
╚══════════════════════════════════════════════════════╝

パスフレーズをなしの場合、警告メッセージが表示される。

╔═══════════════════════════════════════════════════════════════════════════════════════════════╗
║ You have not entered a passphrase - this is in general a bad idea!                            ║
║ Please confirm that you do not want to have any protection on your key.                       ║
║                                                                                               ║
║ <Yes, protection is not needed>                                    <Enter new passphrase>     ║
╚═══════════════════════════════════════════════════════════════════════════════════════════════╝

※パスフレーズを入力していません – これは一般的に悪い考えです!鍵にプロテクトをかけないことをご確認ください。

パスフレーズについて調べていたら、このような説明を見つけた。

パスフレーズの長さには制限がないので、慎重に選択する必要があります。セキュリティの観点からは、秘密鍵を解除するためのパスフレーズは、GnuPG (および他の公開鍵暗号化システムも同様) の最も弱い点の1つであり、他の個人があなたの秘密鍵を入手した場合の唯一の保護手段だからです。理想的には、パスフレーズは辞書に載っている単語を使うべきではありませんし、アルファベットの大文字と小文字を混ぜたり、アルファベット以外の文字を使ったりする必要があります。良いパスフレーズは、GnuPGを安全に使用するために非常に重要です。

DeepL先生による翻訳 : The GNU Privacy Handbook / Chapter 1. Getting Started

今回は十分に準備したので、割り切りでパスフレーズなしを選択している。

これで、パスフレーズを解除、あるいは、日常使いのパスフレーズに変更できた。

GitでGPGキーを利用

Gitコマンドが、署名用のサブキーを使用するように設定する。
また、Giteaに公開鍵を登録し、Giteaが署名を照合できるようにする。

Gitに署名用のサブキーを知らせる

署名する際に署名用のサブキーを使用するよう、Gitにサブキーを知らせる。

署名用サブキーのIDを表示させる。

$ gpg --list-secret-keys --keyid-format long
/home/rohhie/.gnupg/pubring.kbx
-------------------------------
sec#  rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid                 [ultimate] rohhie (https://rohhie.net) <rohhie@rohhie.net>
ssb#  rsa4096/C95010EF5797F3C6 2022-09-26 [E]
ssb   rsa4096/68E65F88C02F927A 2022-09-30 [S]

Gitに知らせる。

$ git config --global user.signingkey 68E65F88C02F927A

署名用のサブキーにパスフレーズを設定した場合、コミットやタグに署名するときにパスフレーズ入力画面が表示される。
このパスフレーズ入力画面を表示する先を示すため、環境変数を設定する必要がある。
これを都度設定するのは手間なので、ログインする度に使えるように、.bashrcに以下を追加する。

~/.bashrc

# tty to enter passphrase for GPG key.
export GPG_TTY=$(tty)

※最後に追加すればOK。忘れないように注意!(自分向け)

Giteaに公開鍵を登録

プライマリーキーの公開鍵IDを表示させる。

$ gpg --list-public-keys --keyid-format long
/home/rohhie/.gnupg/pubring.kbx
-------------------------------
pub   rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid                 [ultimate] rohhie (https://rohhie.net) <rohhie@rohhie.net>
sub   rsa4096/C95010EF5797F3C6 2022-09-26 [E]
sub   rsa4096/68E65F88C02F927A 2022-09-30 [S]

Giteaに登録するため、公開鍵を表示させる。

$ gpg --armor --export D8404F66204D42D3
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBGMxoWQBEADOQTbqqKhB2UA1P+I30dLL/IFf99YKCFDJE0k+UtrOaBn/6Cbx
…
Zagefnv79a1v0kYiQlU0nm4ZQIQRDKNmswBvkK6bBrZm+ESKNbUQWW6wM9e7vsYz
bPqbfIj63sVcTG4FYf0IH9ZQJRqSVDHhrg9QheLW623+CbpolVT45b+6
=f7QF
-----END PGP PUBLIC KEY BLOCK-----

※サブキーのIDでも同じ公開鍵が表示される。

ここで表示された鍵、つまり
—–BEGIN PGP PUBLIC KEY BLOCK—–
 から
—–END PGP PUBLIC KEY BLOCK—–
までをコピーして、Giteaに貼り付ける。

キーを追加したところ、プライマリーキー、サブキーのIDが表示された。

なるほど、サブキーで署名されていても照合がうまくいくのは、こういうことですか。

ここで、確認というボタンが表示されていることに気付く。
押してみるとトークンが表示され、これに署名して確認をするようだ。
緑でマスクした箇所にコマンドが表示されているので、これをローカルで実行し、結果を貼り付けて確認ボタンをクリックする。

確認が完了すると、確認ボタンが表示されなくなった。

これで、GPGキーの登録から確認までができた。

コミットに署名

コミットへの署名の仕方をこちらで教えてくれた。
Github docs / コミットに署名する

$ git commit -S -m "バックアップ実行時のメッセージを丁寧にした"
[container-control 6205664] バックアップ実行時のメッセージを丁寧にした
 1 file changed, 16 insertions(+), 13 deletions(-)

コミットの署名の状態は、以下で確認できる。

$ git log --show-signature -1
commit 62056643a9c7329b6c13dbf9504cbab55dbd32f6 (HEAD -> container-control)
gpg: Signature made Mon Sep 26 22:16:07 2022 JST
gpg:                using RSA key E056E8499A54182ED6EDD3C9D8404F66204D42D3
gpg: Good signature from "rohhie (https://rohhie.net) <rohhie@rohhie.net>" [ultimate]
Author: rohhie <rohhie@rohhie.net>
Date:   Mon Sep 26 22:16:07 2022 +0900

    バックアップ実行時のメッセージを丁寧にした

※この時点ではサブキーができておらず、プライマリーキーで署名したので、フィンガープリントがプライマリーキーのものになっている。

これをGiteaにプッシュしたところ、署名されたコミットであることが画面上ではっきりと分かった。

この緑色の表示は、GiteaのデーターベースにあるGPG公開鍵と照合した結果、rohhieというアカウントが登録したものと一致したことを表している。

試しにGPG鍵を削除してみたところ、以下のように表示が変わった。
マウスで鍵のあたりをポイントすると、「この署名に対応する既知のキーがデータベースに存在しません」と表示される。

タグに署名

タグへの署名の仕方もこちらで教えてくれた。
Github docs / タグに署名する

$ git tag -s 1.0.0

タグに署名されていることが確認できた。

$ git show 1.0.0
tag 1.0.0
Tagger: rohhie <rohhie@rohhie.net>
Date:   Mon Sep 26 22:22:46 2022 +0900

バックアップ実行時のメッセージを丁寧にした。
-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEE4FboSZpUGC7W7dPJ2EBPZiBNQtMFAmMxp70ACgkQ2EBPZiBN
QtOyEg/8C8gYeNMSVHwDYNR7ZG5jKNTAxQwg3FYyyvpwMj8P6hH9694UQyg7LJr4
…

こちらは、Giteaの画面で署名されていることを確認することはできなかった。

署名の確認

自分で確認

署名されたコミットやタグが、本当にあなたが署名したものなのか、受け取った人・見ている人はどうやって確認するのか。
Gitでは、公開鍵をキーサーバーに登録しておいて、確認したい人が公開鍵をキーリングに登録しておく、というのが基本的な考え方のようだった。

コミットを確認する場合には、コミットのハッシュ値を指定して以下を実施。
ハッシュの代わりにHEADでの指定も可能。

$ git verify-commit 62056643a9
gpg: Signature made Mon Sep 26 22:16:07 2022 JST
gpg:                using RSA key E056E8499A54182ED6EDD3C9D8404F66204D42D3
gpg: Good signature from "rohhie (https://rohhie.net) <rohhie@rohhie.net>" [ultimate]

タグを確認する場合には以下。

$ git tag -v 1.0.0
object 62056643a9c7329b6c13dbf9504cbab55dbd32f6
type commit
tag 1.0.0
tagger rohhie <rohhie@rohhie.net> 1664198566 +0900

バックアップ実行時のメッセージを丁寧にした。
gpg: Signature made Mon Sep 26 22:23:09 2022 JST
gpg:                using RSA key E056E8499A54182ED6EDD3C9D8404F66204D42D3
gpg: Good signature from "rohhie (https://rohhie.net) <rohhie@rohhie.net>" [ultimate]

他の人が確認

まだ理解が不十分なので、公開鍵サーバーの利用に踏み切れない。
公開鍵サーバーに一度登録すると、削除してやり直すことができないようなので。
ask ubuntu / Lost PGP private key and want to remove it from keyserver.ubuntu.com

自分でサーバーを立てれば思う存分やれそうだな、と思うだけは思うので、メモしておく。
Gitlab / hagrid-keyserver / hagrid

ということで…

他の人に公開鍵を提供するために、ファイルを作ろう。

$ gpg --armor --export D8404F66204D42D3 > rohhie.pubkey.asc

できあがったrohhie.pubkey.ascを確認したい人から見える場所に置く。

確認したい人は、自分のキーリングにこの公開鍵を取り込む。

$ gpg --import rohhie.pubkey.asc
gpg: key D8404F66204D42D3: public key "rohhie (https://rohhie.net) <rohhie@rohhie.net>" imported
gpg: Total number processed: 1
gpg:               imported: 1

タグを確認してみる。

$ git tag -v 1.0.0
object 62056643a9c7329b6c13dbf9504cbab55dbd32f6
type commit
tag 1.0.0
tagger rohhie <rohhie@rohhie.net> 1664198566 +0900

バックアップ実行時のメッセージを丁寧にした。
gpg: Signature made Mon 26 Sep 2022 01:23:09 PM UTC
gpg:                using RSA key E056E8499A54182ED6EDD3C9D8404F66204D42D3
gpg: Good signature from "rohhie (https://rohhie.net) <rohhie@rohhie.net>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: E056 E849 9A54 182E D6ED  D3C9 D840 4F66 204D 42D3

署名は確認できたが、警告が表示されている。

この鍵は、信頼できる署名で認証されていない!
署名が所有者のものであることを示すものがない。

DeepL先生の翻訳

フィンガープリントが公開されているものと同じであると確認できたので、この公開鍵に署名する。
※公開鍵に署名するためには、自分でもキーペアを持っている必要がある。
superuser / How to suppress “WARNING: This key is not certified with a trusted signature!”

$ gpg --lsign-key "E056 E849 9A54 182E D6ED  D3C9 D840 4F66 204D 42D3" ※RSA keyで表示されるつながった値でもOK!

pub  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: unknown       validity: unknown
sub  rsa4096/C95010EF5797F3C6
     created: 2022-09-26  expires: never       usage: E
sub  rsa4096/68E65F88C02F927A
     created: 2022-09-30  expires: never       usage: S
[ unknown] (1). rohhie (https://rohhie.net) <rohhie@rohhie.net>


pub  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: unknown       validity: unknown
 Primary key fingerprint: E056 E849 9A54 182E D6ED  D3C9 D840 4F66 204D 42D3

     rohhie (https://rohhie.net) <rohhie@rohhie.net>

Are you sure that you want to sign this key with your
key "piyo piyo <piyo@hogeserver.hogeddns.jp>" (482569E2A1E6F918)

The signature will be marked as non-exportable.

Really sign? (y/N) y[Enter]

これで、警告は表示されなくなった。

$ git tag -v 1.0.0
fatal: not a git repository (or any of the parent directories): .git
HOGEDOMAIN\piyo@party:~$ cd hd-backup/
HOGEDOMAIN\piyo@party:~/hd-backup$ git tag -v 1.0.0
object 62056643a9c7329b6c13dbf9504cbab55dbd32f6
type commit
tag 1.0.0
tagger rohhie <rohhie@rohhie.net> 1664198566 +0900

バックアップ実行時のメッセージを丁寧にした。
gpg: Signature made Mon 26 Sep 2022 01:23:09 PM UTC
gpg:                using RSA key E056E8499A54182ED6EDD3C9D8404F66204D42D3
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   1  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: depth: 1  valid:   1  signed:   0  trust: 1-, 0q, 0n, 0m, 0f, 0u
gpg: Good signature from "rohhie (https://rohhie.net) <rohhie@rohhie.net>" [full]

公開鍵に署名したが、やっぱり取り消したい場合は、鍵を編集する。

$ gpg --edit-key E056E8499A54182ED6EDD3C9D8404F66204D42D3
…
sub  rsa4096/68E65F88C02F927A
     created: 2022-09-30  expires: never       usage: S
[  full  ] (1). rohhie (https://rohhie.net) <rohhie@rohhie.net>

uidで対象者を選択。

gpg> uid 1

pub  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: unknown       validity: full
sub  rsa4096/C95010EF5797F3C6
     created: 2022-09-26  expires: never       usage: E
sub  rsa4096/68E65F88C02F927A
     created: 2022-09-30  expires: never       usage: S
[  full  ] (1)* rohhie (https://rohhie.net) <rohhie@rohhie.net>

自分の署名を削除する。

gpg> delsig
uid  rohhie (https://rohhie.net) <rohhie@rohhie.net>
sig!3        D8404F66204D42D3 2022-09-26  [self-signature]
Delete this good signature? (y/N/q)[Enter] ※これは公開鍵にrohhieがした署名なので消さない
uid  rohhie (https://rohhie.net) <rohhie@rohhie.net>
sig!  L      482569E2A1E6F918 2022-10-01  piyo piyo <piyo@hogeserver.hogeddns.jp>
Delete this good signature? (y/N/q)y[Enter] ※自分がした署名を消す
Deleted 1 signature.

保存して終了する。

gpg> save

これで、署名していない状態に戻すことができた。

秘密鍵のメンテナンス

秘密鍵の復元や、サブキーの無効化を整理する。

秘密鍵の復元

普段使いのサブキーが漏洩したので無効化したい、他の作業環境で使いたいので新たにサブキーを作りたい、といった場合、プライマリーキーが必要になる。

安全な場所で秘密鍵を復元する。

$ gpg --import primary-secretkey
gpg: directory '/home/rohhie/.gnupg' created
gpg: keybox '/home/rohhie/.gnupg/pubring.kbx' created
gpg: /home/rohhie/.gnupg/trustdb.gpg: trustdb created
gpg: key D8404F66204D42D3: public key "rohhie (https://rohhie.net) <rohhie@rohhie.net>" imported

秘密鍵のパスフレーズを入力する。

╔═══════════════════════════════════════════════════════════════╗
║ Please enter the passphrase to import the OpenPGP secret key: ║
║ "rohhie (https://rohhie.net) <rohhie@rohhie.net>"             ║
║ 4096-bit RSA key, ID D8404F66204D42D3,                        ║
║ created 2022-09-26.                                           ║
║                                                               ║
║                                                               ║
║ Passphrase: ********************************_________________ ║
║                                                               ║
║         <OK>                                   <Cancel>       ║
╚═══════════════════════════════════════════════════════════════╝

これで秘密鍵がインポートされた。

gpg: key D8404F66204D42D3: secret key imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

秘密鍵はインポートできたが、信用の状態がunknownになっている。

$ gpg --list-secret-keys --keyid-format long
/home/rohhie/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid                 [ unknown] rohhie (https://rohhie.net) <rohhie@rohhie.net>
ssb   rsa4096/C95010EF5797F3C6 2022-09-26 [E]
ssb   rsa4096/68E65F88C02F927A 2022-09-30 [S]

そこで、鍵を完全に信用した状態に編集する。

$ gpg --edit-key D8404F66204D42D3
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: unknown       validity: unknown
ssb  rsa4096/C95010EF5797F3C6
     created: 2022-09-26  expires: never       usage: E
ssb  rsa4096/68E65F88C02F927A
     created: 2022-09-30  expires: never       usage: S
[ unknown] (1). rohhie (https://rohhie.net) <rohhie@rohhie.net>

gpg> trust[Enter]
sec  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: unknown       validity: unknown
ssb  rsa4096/C95010EF5797F3C6
     created: 2022-09-26  expires: never       usage: E
ssb  rsa4096/68E65F88C02F927A
     created: 2022-09-30  expires: never       usage: S
[ unknown] (1). rohhie (https://rohhie.net) <rohhie@rohhie.net>

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately ※最初にキーペアを作った時にはこれが設定されている
  m = back to the main menu

Your decision? 5[Enter]
Do you really want to set this key to ultimate trust? (y/N) y[Enter]

sec  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: ultimate      validity: unknown
ssb  rsa4096/C95010EF5797F3C6
     created: 2022-09-26  expires: never       usage: E
ssb  rsa4096/68E65F88C02F927A
     created: 2022-09-30  expires: never       usage: S
[ unknown] (1). rohhie (https://rohhie.net) <rohhie@rohhie.net>
Please note that the shown key validity is not necessarily correct
unless you restart the program.

gpg> quit[Enter]

これで復旧できた。

サブキーの無効化

サブキーの無効化

サブキーが漏洩するなど、何らかの事情でサブキーを無効化する場合を試してみた。
これはman pageを見てもちょっと分からなかったが、こちらで詳しく教えてくれたので実行できた。
Chew, Kean Ho (Holloway) / Revoke GPG Subkey

プライマリーキーのIDを表示させる。

$ gpg --list-secret-keys --keyid-format long
/home/rohhie/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid                 [ultimate] rohhie (https://rohhie.net) <rohhie@rohhie.net>
ssb   rsa4096/C95010EF5797F3C6 2022-09-26 [E]
ssb   rsa4096/68E65F88C02F927A 2022-09-30 [S]

プライマリーキーを編集する。

$ gpg --edit-key D8404F66204D42D3

gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa4096/C95010EF5797F3C6
     created: 2022-09-26  expires: never       usage: E
ssb  rsa4096/68E65F88C02F927A
     created: 2022-09-30  expires: never       usage: S
[ultimate] (1). rohhie (https://rohhie.net) <rohhie@rohhie.net>

※サブキーだけがあった時は “Secret subkeys are available.” と表示されており、無効化はできなかった。

無効化したいサブキーを選択する。今回は0から数えて2番目にあるので、2。

gpg> key 2

sec  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa4096/C95010EF5797F3C6
     created: 2022-09-26  expires: never       usage: E
ssb* rsa4096/68E65F88C02F927A
     created: 2022-09-30  expires: never       usage: S
[ultimate] (1). rohhie (https://rohhie.net) <rohhie@rohhie.net>

無効化。

gpg> revkey
Do you really want to revoke this subkey? (y/N) y
Please select the reason for the revocation:
  0 = No reason specified
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  Q = Cancel
Your decision? 3
Enter an optional description; end it with an empty line:
> No longer using this key.
>
Reason for revocation: Key is no longer used
No longer using this key.
Is this okay? (y/N) y

プライマリーキーのパスフレーズの入力する。

╔═══════════════════════════════════════════════════════════════╗
║ Please enter the passphrase to unlock the OpenPGP secret key: ║
║ "rohhie (https://rohhie.net) <rohhie@rohhie.net>"             ║
║ 4096-bit RSA key, ID D8404F66204D42D3,                        ║
║ created 2022-09-26.                                           ║
║                                                               ║
║                                                               ║
║ Passphrase: _________________________________________________ ║
║                                                               ║
║         <OK>                                   <Cancel>       ║
╚═══════════════════════════════════════════════════════════════╝

サブキーが無効化された。

sec  rsa4096/D8404F66204D42D3
     created: 2022-09-26  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa4096/C95010EF5797F3C6
     created: 2022-09-26  expires: never       usage: E
The following key was revoked on 2022-10-01 by RSA key D8404F66204D42D3 rohhie (https://rohhie.net) <rohhie@rohhie.net>
ssb  rsa4096/68E65F88C02F927A
     created: 2022-09-30  revoked: 2022-10-01  usage: S
[ultimate] (1). rohhie (https://rohhie.net) <rohhie@rohhie.net>

結果を保存して終了する。

gpg> save

無効化の見え方

サブキーが無効化されたことはどのように見えるのか、公開鍵の情報を確認してみた。
stackoverflow / How to display gpg key details without importing it?

$ gpg --export -a D8404F66204D42D3 | gpg
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub   rsa4096 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid           rohhie (https://rohhie.net) <rohhie@rohhie.net>
sub   rsa4096 2022-09-26 [E]
sub   rsa4096 2022-09-30 [S] [revoked: 2022-10-01]

公開鍵を更新すれば、サブキーが無効化したことが分かるようだ。

Giteaでは期限が確認されない

他のホストで無効化したサブキーを使ってコミットに署名してみた。
これをGiteaにプッシュしたところ、署名は有効に見えていた。

これは、制限事項のようだ。

Gitea will verify GPG commit signatures in the provided tree by checking if the commits are signed by a key within the Gitea database, or if the commit matches the default key for Git.
Giteaは、提供されたツリーのGPGコミット署名を、コミットがGiteaデータベース内の鍵によって署名されているか、またはコミットがGitのデフォルトの鍵と一致するかどうかをチェックすることによって検証します。

Keys are not checked to determine if they have expired or revoked. Keys are also not checked with keyservers.
鍵は、有効期限が切れているかどうか、失効しているかどうか、はチェックされません。また、鍵はキーサーバーでチェックされません。

Gitea Docs / GPG Commit Signatures : DeepL先生の翻訳

気になるなら、ローカルで検証するしかなさそうだ。

ローカルでの検証

無効化したサブキーで署名されたコミットをブルする。

$ git pull

コミットは以下で検証することができて、警告が表示された。

$ git verify-commit HEAD
gpg: Signature made Sat 01 Oct 2022 04:05:21 AM UTC
gpg:                using RSA key E77021FD057C7420509FEA4968E65F88C02F927A
gpg: Good signature from "rohhie (https://rohhie.net) <rohhie@rohhie.net>" [ultimate]
gpg: WARNING: This subkey has been revoked by its owner!
gpg: reason for revocation: Key is no longer used
gpg: revocation comment: No longer using this key.

参考までに、1つ前のコミットも検証してみた。
プライマリーキーで署名していて、ワーニングが表示されていない。

$ git verify-commit 1a1ba41
gpg: Signature made Thu 29 Sep 2022 09:41:49 PM UTC
gpg:                using RSA key E056E8499A54182ED6EDD3C9D8404F66204D42D3
gpg: Good signature from "rohhie (https://rohhie.net) <rohhie@rohhie.net>" [ultimate]

やったこと

GPGとPGP

公開鍵を表示させたとき、PGP PUBLIC KEYと書かれていた。

$ gpg --armor --export D8404F66204D42D3
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBGMxoWQBEADOQTbqqKhB2UA1P+I30dLL/IFf99YKCFDJE0k+UtrOaBn/6Cbx
…
us+kMVIkBbSe8UYgP6OETRDvpiGzr7xuYTF/OVs7gMLNZkATrUsAn13Y7lVEvYOf
jmG9gGFAhQie1jI=
=PIQs
-----END PGP PUBLIC KEY BLOCK-----

※秘密鍵をエクスポートする場合は –export-secret-keys で、パスフレーズの入力を求められる。

何か違うのか探してみたら、こちらでわかりやすく教えてくれていた。

PGPはPretty Good Privacyの略で、Philip Zimmermannが開発した暗号化ソフトウェアだ。一方、GPGはGnu Privacy Guardの略で、GnuPGとも呼ばれている。OpenPGPに準拠した無料の暗号化ソフトウェア(GPL)である。PGPとGPGの違いは、PGPは商用で利用するには有料であるが、特許を持つ暗号化アルゴリズムなども利用できる。GPGの方は商用で利用する場合でも無料であるが、特許に抵触するアルゴリズムは採用していない。個人的にはGPGを利用している。Linuxでは普通に使われているし、Windowsでも問題なく導入できる。

良いもの。悪いもの。 / PGP/GPGを薦めたいが…

両者のフォーマットは同じだけれど、多くはGnuPGで鍵が作られているから、GPGキーという表記があるのかなと想像。
この投稿ではGiteaの表示に合わせて、GPGキーと表記することにした。

フィンガープリント

実は、GPGキーで署名されたものの確認方法として、最初に見つかったのはフィンガープリントを使う、という話だった。
とりあえず、フィンガープリントを表示させる。

$ gpg --list-secret-keys --keyid-format=long --with-fingerprint
/home/rohhie/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      Key fingerprint = E056 E849 9A54 182E D6ED  D3C9 D840 4F66 204D 42D3
uid                 [ultimate] rohhie (https://rohhie.net) <rohhie@rohhie.net>
ssb   rsa4096/C95010EF5797F3C6 2022-09-26 [E]

でも、–with-fingerprintパラメーターがなくても、同じ値が表示されていた。
フィンガープリントだったのか。これ、GitではRSA keyとして表記されることもある値だったりもする。

$ gpg --list-secret-keys --keyid-format=long
/home/rohhie/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096/D8404F66204D42D3 2022-09-26 [SC]
      E056E8499A54182ED6EDD3C9D8404F66204D42D3
uid                 [ultimate] rohhie (https://rohhie.net) <rohhie@rohhie.net>
ssb   rsa4096/C95010EF5797F3C6 2022-09-26 [E]

フィンガープリントの伝え方は、ホームページで公開するぐらいの勢いで良いようだ。

誰でも鍵サーバーに鍵を送ることができます。そのため、ダウンロードした鍵が本当にその人のものであると信用してはいけません。入手した鍵の指紋を、持ち主が別の場所(ブログ、サイト、メール・電話で連絡するなど)で公開している指紋と比較してその鍵の真正性を確かめるべきです。複数の情報源を使うことでその鍵の信頼性は増します。

ArchWiki / GnuPG

コミットの場合はこれで、フィンガープリントが一致していることで確認ができる。

$ git verify-commit 62056643a9
gpg: Signature made Mon Sep 26 22:16:07 2022 JST
gpg:                using RSA key E056E8499A54182ED6EDD3C9D8404F66204D42D3
gpg: Can't check signature: No public key

タグの場合も、フィンガープリントが一致していることで確認ができる。

$ git tag -v 1.0.0
object 62056643a9c7329b6c13dbf9504cbab55dbd32f6
type commit
tag 1.0.0
tagger rohhie <rohhie@rohhie.net> 1664198566 +0900

バックアップ実行時のメッセージを丁寧にした。
gpg: Signature made Mon Sep 26 22:23:09 2022 JST
gpg:                using RSA key E056E8499A54182ED6EDD3C9D8404F66204D42D3
gpg: Can't check signature: No public key

でも、Gitで使うのなら、公開鍵を自分の環境に登録、フィンガープリントなどを慎重に確認して署名、という使い方が素直。

起きたこと

gpg failed to sign the data

パスフレーズで保護したGPG鍵で署名しようとしたら、エラーが表示された。
パスフレーズ入力画面が表示されないままエラーになっている。

$ git tag -s 1.0.1 -m "パスフレーズで保護したGPG鍵を使ってtagを作成するテスト"
error: gpg failed to sign the data
error: unable to sign the tag

こちらで、何が起きているのかを調べる方法を教えてくれた。
Github Gist / paolocarrasco / README.md

$ GIT_TRACE=1 git tag -s 1.0.1 -m "パスフレーズで保護したGPG鍵を使ってtagを作成するテスト"
06:25:19.891133 git.c:455               trace: built-in: git tag -s 1.0.1 -m 'パスフレーズで保護したGPG鍵を使ってtagを作成するテスト'
06:25:19.892645 run-command.c:668       trace: run_command: gpg --status-fd=2 -bsau 0D287D70CA483368
error: gpg failed to sign the data
error: unable to sign the tag

実際に、gpg –status-fd=2 -bsau 0D287D70CA483368 を実行してみると、文字入力画面になり、[Ctrl]+[d]でパスフレーズ入力画面になった。

再確認したところ、この手順が漏れていることが分かった。

$ [ -f ~/.bashrc ] && echo 'export GPG_TTY=$(tty)' >> ~/.bashrc

Github docs / Git へ署名キーを伝える

早速、以下を実行したところ、タグを作成する際にパスフレーズ入力画面が表示された。

$ export GPG_TTY=$(tty)
$ GIT_TRACE=1 git tag -s 1.0.1 -m "パスワードで保護したGPG鍵を使ってtagを作成するテスト"

これが毎回実行されるように、.bashrcに追加した。

さいごに

公開鍵を取り込んで、署名。やっぱりその署名を削除。
という操作を試したときに、uid指定があったことでボンヤリ思い出したのだけれど、これ組織で運用する時には鍵の管理者を置いて、メンバーに鍵を配ったりするんじゃなかったっけ。
メンバーはそれを使って安全にメールをやりとりするとか、そんなのだった気がする。
色々なシーンで使われていそうだから、この観点で色々と情報を見直してみようかな。

それにしても、だいぶ回り道をしたなー。
GiteaでGPGキーという表記があって、前回の記事でそれに触れていなかったからちょっと追記しようかな、と調べはじめたんだけれど、GPGを理解して整理するのにだいぶ時間が掛かってしまった。それでも理解は覚束ないし、キーを管理するPGPキーサーバーについては触ってもいない。
これもどこかでやってみないと。

やればやるほど分からないことが増えていく。どこかで分かったような気になれるものなのだろうか。

広告
ろっひー

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他