GPGの「This key is not certified with a trusted signature」の解決方法

## はじめに

Notepad++というエディターのインストーラーにはGPG署名が付いていてファイルが改ざんされていないことを検証することができます[^1]。[ダウンロードのページ](https://notepad-plus-plus.org/downloads/)に行くと、インストーラーのファイルの隣にあるGPG SignatureというファイルがGPG署名です。

さて、gpgで署名を検証すると次のWARNINGが出ていました。

> gpg: WARNING: This key is not certified with a trusted signature!
>
> gpg:     There is no indication that the signature belongs to the owner.

このWARNINGを放置しておいても問題なさそうなのですが、このWARNINGを解決する方法を2つ調べました。Notepad++の例で説明します。

## 本記事の対象者

次のWARNINGを消したい方。

> gpg: WARNING: This key is not certified with a trusted signature!
>
> gpg:     There is no indication that the signature belongs to the owner.

日本語表示なら次の警告を消したい方。

> gpg: *警告*: この鍵は信用できる署名で証明されていません!
> gpg:       この署名が所有者のものかどうかの検証手段がありません。

## WARNINGを解決する方法(1)

１つ目の方法は、[The GNU Privacy Handbook](https://www.gnupg.org/gph/en/manual/book1.html)[^2] の [Generating a new keypair](https://www.gnupg.org/gph/en/manual/c14.html#AEN25) にある方法で、自分の鍵を作成した後、[Importing a public key](https://www.gnupg.org/gph/en/manual/x56.html#AEN83) にある方法で、鍵指紋を確認(fpr)してから、署名(sign)することです。

次のコマンドで自分の鍵を作成します。すでに自分の鍵があればスキップしてください。

```sh
gpg --gen-key
```

次のコマンドでNotepad++の鍵を編集します[^3]。

```sh
gpg --edit-key don.h@free.fr
```

プロンプトで「fpr」を入力してNotepad++の鍵指紋(key fingerprint)を表示してください。

```sh
gpg> fpr
pub   rsa4096/6C429F1D8D84F46E 2019-03-11 Notepad++ <don.h@free.fr>
 Primary key fingerprint: 14BC E436 2749 B2B5 1F8C  7122 6C42 9F1D 8D84 F46E
```

[Notepad++の公式ページのResources](https://notepad-plus-plus.org/resources/) を開き、そこに記載された鍵指紋と一致していることを確認してください。

鍵指紋が一致していれば鍵の正しいコピーを持っていると確信できます。このことはThe GNU Privacy HandbookのImporting a public keyに記載されています。「If the fingerprint you get is the same as the fingerprint the key's owner gets, then you can be sure that you have a correct copy of the key.」の部分です。

鍵の正しいコピーを持っていると確信できたら、プロンプトに「sign」[^4]を入力してNotepad++の鍵に署名してください。

```sh
gpg> sign
Really sign? (y/N) y
gpg> quit
Save changes? (y/N) y
```



次のように署名検証の結果が変わり、WARNINGを消せました。

```sh
gpg --verify npp.8.5.8.Installer.x64.exe.sig
```

> gpg: assuming signed data in 'npp.8.5.8.Installer.x64.exe'
> gpg: Signature made Tue Oct 17 21:15:55 2023
> gpg:                using RSA key 14BCE4362749B2B51F8C71226C429F1D8D84F46E
> gpg: Good signature from "Notepad++ <don.h@free.fr>" [full]



## WARNINGを解決する方法(2)

２つ目の方法は、Notepad++の鍵の信用度を５のI trust ultimately（究極的に信用する）にすることでも解決できます。

次のコマンドでNotepad++の鍵を編集します。

```sh
gpg --edit-key don.h@free.fr
```

プロンプトで「trust」を入力して公開鍵の信用度を設定してください。

```sh
gpg> trust

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
```



```sh
他のユーザの鍵を正しく検証するために、このユーザの信用度を決めてください
パスポートを見せてもらったり、他から得たフィンガープリントを検査したり、などなど)

 1 = 知らない、または何とも言えない
 2 = 信用し ない
 3 = まぁまぁ信用する
 4 = 充分に信用する
 5 = 究極的に信用する
 m = メーン・メニューに戻る
```

鍵指紋を確認(fpr)して、鍵を究極的に信用できるのであれば、5のI trust ultimatelyを選択してください。鍵指紋を確認する方法はすでに書きました。

```sh
Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y
```



次のように署名検証の結果が変わり、WARNINGを消せました。

```sh
gpg --verify npp.8.5.8.Installer.x64.exe.sig
```



> gpg: assuming signed data in 'npp.8.5.8.Installer.x64.exe'
>
> gpg: Signature made Tue Oct 17 21:15:55 2023
>
> gpg:        using RSA key 14BCE4362749B2B51F8C71226C429F1D8D84F46E
>
> 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
>
> gpg: next trustdb check due at 2024-03-11
>
> gpg: Good signature from "Notepad++ <don.h@free.fr>" [ultimate]

gpg: checking the trustdbという余計なメッセージが出るのは、初回のみで、次回以降からは消えます。

もしかしたら `gpg --update-trustdb` のコマンド実行が必要かもしれません。自分の鍵[^5]を作成しないで、かつ究極的に信用された鍵がが１つもなければこのコマンドで「no ultimately trusted keys found」というエラーが出ました。このコマンドを実行するために究極的に信用された鍵が1つ以上必要だということの裏返しだと思います。

## さいごに

GPGの署名検証でWARNINGを解決する2つの方法を紹介しました。自分の鍵を作っている方は(1)の方法になり、作っていない方は(2)の方法になると思います。

[^1]: MD5やSHA-256を計算してファイルが改ざんされてないことを検証するようなことです。GPGは秘密鍵がないと署名ファイルを作れないので、MD5やSHA-256より安全だと思います。
[^2]: 1999年に書かれた英語の文書ですがGPGについて他では書かれていない基礎がすべて書かれているような貴重な文書です。今回、読んで目から鱗でした。
[^3]: どこかのキーサーバーからNotepad++の公開鍵を取得していることが前提です。
[^4]: signコマンドで署名するとキーサーバーに送信したときに自分が誰に署名したかが公開され、lsignコマンドで署名すると自分が誰に署名したかが公開されないと思います。そのことの実行確認まで行っていませんが、[Ubuntuのキーサーバー](https://keyserver.ubuntu.com/) で「don.h@free.fr」を入力して鍵検索したら、誰に署名したかと誰に署名されたかが検索結果に表示されることからも分かると思います。
[^5]: 自分で作った鍵は究極的に信用されています。