恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

GnuPGでSHA512SUMSを検証する

この記事の作業はDebian 11(bullseye)で行っています。

目次


概略

DebianのサイトからダウンロードしたISOイメージに問題がないか調べる際、SHA512SUMSというファイルに記述されているハッシュ値を使いますが、そもそもこのファイルが第三者によって改ざんされていないか確認する必要があります。

その確認を行うために、分離署名というものを使います。分離署名はSHA512SUMS.signというファイルです。

SHA512SUMS        チェックサム(ハッシュ値)を記述したファイル
SHA512SUMS.sign   SHA512SUMSに対する分離署名ファイル

本記事は、GnuPGとSHA512SUMS.signを使ってSHA512SUMSが正しいかどうかを検証した際の作業メモです。


検証に失敗した場面

SHA512SUMSとSHA512SUMS.signを置いてあるディレクトリで

$ gpg --verify SHA512SUMS.sign SHA512SUMS 

を実行したら、次のように表示されました。

gpg: ディレクトリ'/home/hoge/.gnupg'が作成されました
gpg: keybox'/home/hoge/.gnupg/pubring.kbx'が作成されました
gpg: 2023年04月30日 05時48分09秒 JSTに施された署名
gpg:                RSA鍵DF9B9C49EAA9298432589D76DA87E80D6294BE9Bを使用
gpg: 署名を検査できません: No public key

5行目に「署名を検査できません」とあります。これは、SHA512SUMS.signを検証するために必要な公開鍵がGnuPGにインポートされていないためです。


公開鍵のインポート

公開鍵をインポートするために、Debianのサイトで公開鍵のIDを調べます。

Verifying authenticity of Debian images
https://www.debian.org/CD/verify.en.html

を開くと、ページ下部に公開鍵の情報が載っています。

pub   rsa4096/988021A964E6EA7D 2009-10-03
      Key fingerprint = 1046 0DAD 7616 5AD8 1FBC  0CE9 9880 21A9 64E6 EA7D
uid                  Debian CD signing key <debian-cd@lists.debian.org>

pub   rsa4096/DA87E80D6294BE9B 2011-01-05 [SC]
      Key fingerprint = DF9B 9C49 EAA9 2984 3258  9D76 DA87 E80D 6294 BE9B
uid                  Debian CD signing key <debian-cd@lists.debian.org>

pub   rsa4096/42468F4009EA8AC3 2014-04-15 [SC]
      Key fingerprint = F41D 3034 2F35 4669 5F65  C669 4246 8F40 09EA 8AC3
uid                  Debian Testing CDs Automatic Signing Key <debian-cd@lists.debian.org>

pub行の「rsa4096/」の後ろに続いている公開鍵IDを使用します。

$ gpg --keyserver keyring.debian.org --recv-keys 988021A964E6EA7D

を実行すると

gpg: 鍵988021A964E6EA7D: 公開鍵"Debian CD signing key <debian-cd@lists.debian.org>"をインポートしました
gpg:           処理数の合計: 1
gpg:             インポート: 1

と表示されました。これで公開鍵を1つインポートできました。

これに続いて

$ gpg --keyserver keyring.debian.org --recv-keys DA87E80D6294BE9B
$ gpg --keyserver keyring.debian.org --recv-keys 42468F4009EA8AC3

を実行すれば、Debianのサイトに記述されていた3つの公開鍵がインポートされます。

インポートされたか確認してみます。

$ gpg --list-key

を実行したら、次のように表示されました。

/home/hoge/.gnupg/pubring.kbx
-----------------------------
pub   rsa4096 2009-10-03 [SC]
      10460DAD76165AD81FBC0CE9988021A964E6EA7D
uid           [  不明  ] Debian CD signing key <debian-cd@lists.debian.org>

pub   rsa4096 2011-01-05 [SC]
      DF9B9C49EAA9298432589D76DA87E80D6294BE9B
uid           [  不明  ] Debian CD signing key <debian-cd@lists.debian.org>
sub   rsa4096 2011-01-05 [E]

pub   rsa4096 2014-04-15 [SC]
      F41D30342F3546695F65C66942468F4009EA8AC3
uid           [  不明  ] Debian Testing CDs Automatic Signing Key <debian-cd@lists.debian.org>
sub   rsa4096 2014-04-15 [E]

なお、表示された各行のうちpub行とuid行の間に表示されるのは key fingerprint です。このkey fingerprintとDebianサイトに記載されているkey fingerprintが一致していればOKです。

<補足:ファイルからのインポート>
公開鍵はファイルからインポートすることもできます。

今回の例に当てはめると、Debianのサイトを見ると公開鍵のID部分はリンクになっています。ここを右クリックして「名前を付けてリンク先を保存」を選びます。
すると、公開鍵がファイルとしてダウンロードされます。

仮にダウンロードしたファイルが hoge_key.txtだった場合

gpg --import hoge_key.txt

を実行することで公開鍵がインポートされます。


公開鍵にもとづいて検証する

ここまでの作業で公開鍵はインポートされました。改めてSHA512SUMS.signを使ってSHA512SUMSを検証します。

<検証に使う書式>
gpg --verify <分離署名ファイル> <署名対象のファイル>


上記書式に従って

$ gpg --verify SHA512SUMS.sign SHA512SUMS 

を実行したら

gpg: 2023年04月30日 05時48分09秒 JSTに施された署名
gpg:                RSA鍵DF9B9C49EAA9298432589D76DA87E80D6294BE9Bを使用
gpg: "Debian CD signing key <debian-cd@lists.debian.org>"からの正しい署名 [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
 主鍵フィンガープリント: DF9B 9C49 EAA9 2984 3258  9D76 DA87 E80D 6294 BE9B

という検証結果が表示されました。

この検証結果を見ると「警告」という言葉もあって少々不安ですよね。しかし、ネット情報によると

"Debian CD signing key <debian-cd@lists.debian.org>"からの正しい署名 [不明の]

という風に「からの正しい署名」が表示されていれば問題ないようです。

この点に関しては、

http://bluearth.cocolog-nifty.com/blog/debian_gnulinux/index.html

というサイトを参照しました。このサイトによると上記の検証結果は

・インポートした公開鍵で署名を検証した結果、このSHA512ファイルは確かなものである
・しかし、この公開鍵が信用できるかは不明である

ということを示しているようです(この辺りのことは同サイトにもう少し詳しく書かれています)。


なお、同サイトによると、「信頼度」を変更すればもう少し安心できる答えが返ってくるようです。しかし、実質的なメリットが無いので私はやっていません。ご興味のある方は、同サイトの下部にある「信頼度を変更する場合」という項目を読むと幸せになれるかもしれません。


インポートした公開鍵を削除するには?

今回の作業途中、不要な公開鍵をGnuPGにインポートしてしまいました。そこで、インポートした公開鍵を削除しました。

書式
$ gpg --delete-keys <メールアドレス>

例えば、

$ gpg --delete-keys hogehoge@debian.org

を実行すると

この鍵を鍵リングから削除しますか? (y/N) 

と聞かれるので y を入力します。

この後で「gpg --list-key」を実行すれば、公開鍵が削除されていることを確認できます。


参考にしたサイト

(1) http://bluearth.cocolog-nifty.com/blog/debian_gnulinux/index.html
(2) https://www.debian.org/CD/verify.en.html
(3) https://keyring.debian.org/
(4) https://lecture.ecc.u-tokyo.ac.jp/johzu/joho/Y2022/GPG/GPG/index.html


(1)はDebian環境でGnuPGの使い方を説明しています。(2)と(3)はDebianのサイトです。(4)は大学の授業スライドです。GPGの基本から説明しています。