PGP署名の検証

はじめに

Google Play からAndroid 端末にインストールしていたTermux の更新が止まり、パッケージ管理のリポジトリへの接続も失敗するようになっていたので、公式サイトで案内されているF-Droid を使ってインストールすることにしました。

F-Droid はGoogle Play を使わずに、APKファイルをF-Droid のサイトからダウンロードしてインストールする必要があったので、ダウンロードしたAPKファイルをPGP 署名で検証しようと思ったけれど、検証の仕方が全くわからなかったので調べながらやった記録です。(GnuPG を使ってみた記録です

GnuPG

環境について

  • MacBook Pro 2022(macOS Monterey)

手順

1. GnuPG のインストール

Homebrew を使ってインストールしました。

  • GnuPG の配布されているバージョンは、2系は最新バージョンLTS の2つあったのでLTS をインストールした
  • GnuPG は2.x のxが偶数をLTS としているようです
  • [email protected] – Homebrew
brew install [email protected]
Homebrew gnupg@2.2 インストール

インストール時のプロンプトに上記のコメントがありました。
インストールしたのがkeg-only だからパスが通っていないとのことなので、~/.zshrc に下記を追記します。

export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"

追記した後にsource ~/.zshrc を実行して設定を反映します。

2. ファイルのダウンロード

F-Droid の公式サイトから署名対象のAPKファイル署名ファイルをダウンロードします。

F-Droid

QRコードは”F-DROIDをダウンロード” のリンク先と同じF-Droid.apk のURL なので、スマホでダウンロードする際はこのQRコードを使う感じになっています。

  • 署名対象のAPKファイル
    • F-Droid のAPKファイル。F-Droid.apk
  • 署名ファイル
    • F-Droid の署名ファイル。F-Droid.apk.asc

3. 署名の検証に使う公開鍵のダウンロード

署名の検証に使うF-Droid公開鍵を入手する方法を調べたところ、F-Droid のAPKファイルと同じ場所に置いたら公開鍵も一緒に置き換えられるだろうからそんな検証意味あるか?みたいなことが書かれていました。

PGPの信頼の輪の仕組みにより配布されている公開鍵を入手するのが正解のようです。(たぶん)

下記のコマンドを実行して公開鍵サーバの公開鍵を検索します。

gpg --search-keys f-droid
公開鍵サーバの公開鍵の検索

上記のように”f-droid” で2件検出されました。
下記の公式サイトに掲載されている公開鍵の情報のユーザID(GPG signing key)と一致している(1) を選択して公開鍵をダウンロードします。ダウンロードと同時にインポートされました。

F-Droid 署名鍵

インポートされた公開鍵を下記のコマンドで確認します。

gpg --list-keys
インポートした公開鍵(不明)

~/.gnupg/pubring.kbx に先ほど選択した公開鍵が登録されていましたが、uid の欄で”不明” という扱いになっています。

公開鍵が配布者により署名されていないので、この状態で署名を検証すると下記のように検証に失敗します。

gpg --verify F-Droid.apk.asc
署名の検証(不明)

4. ダウンロードした公開鍵に署名する

ダウンロードした公開鍵が正規のものであるかは、公式サイトに掲載されている公開鍵の情報と公開鍵サーバから入手した公開鍵が同じであることが信頼できるものとして、自身の署名用の鍵を使って公開鍵に署名します。

とはいえ、まだ自身の署名用の鍵を作っていなかったので、まずは下記のコマンドで公開鍵暗号のキーペアを作成します。

  • gpg の鍵を生成するコマンドは3種類ありました。とりあえず、鍵の種類などを指定できるgpg –full-gen-key で作ることにしました。
    • gpg –full-gen-key
      • 鍵の種類、鍵長、有効期限:指定して作成する
      • ユーザIDの構成情報(名前、メールアドレス):指定して作成する
    • gpg –gen-key
      • 鍵の種類、鍵長、有効期限:デフォルトで作成される
      • ユーザIDの構成情報(名前、メールアドレス):指定して作成する
    • gpg –quick-gen-key
      • プロンプトで何も入力しないで作成する
gpg --full-gen-key

続けて、ダウンロードした公開鍵に署名します。

gpg --lsign-key F-Droid

署名後の公開鍵をgpg –list-keys で確認すると、uid の欄が”充分” になっていました。

インポートした公開鍵(充分)

5. 署名の検証

準備が整ったので署名を検証します。

gpg --verify F-Droid.apk.asc
署名の検証(充分)

今回は署名が”充分” となり、メッセージの内容から問題はなかったようです。

あとがき

Android 端末にインストールしようとしているソフトウェアが正規のものであることを今回はパソコンで検証しましたが、これがAndroid 端末上でできたらよいのですが、標準でその機能はなさそうです。
今回インストールするF-Droid を使ってインストールする予定のTermux にGnuPG をインストールすればできそうな気がします。

とりあえず、今回はここまでです。

参考