「Pacman/パッケージの署名」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
 
(4人の利用者による、間の18版が非表示)
1行目: 1行目:
 
{{Lowercase title}}
 
{{Lowercase title}}
[[Category:パッケージ管理]]
+
[[Category:パッケージマネージャー]]
  +
[[Category:コマンド]]
 
[[en:Pacman/Package signing]]
 
[[en:Pacman/Package signing]]
 
[[es:Pacman/Package signing]]
 
[[es:Pacman/Package signing]]
 
[[fr:pacman-key]]
 
[[fr:pacman-key]]
 
[[it:Pacman/Package signing]]
 
[[it:Pacman/Package signing]]
  +
[[pt:Pacman/Package signing]]
 
[[ru:Pacman/Package signing]]
 
[[ru:Pacman/Package signing]]
[[tr:pacman paket imzaları]]
 
 
[[zh-hans:Pacman/Package signing]]
 
[[zh-hans:Pacman/Package signing]]
 
{{Related articles start}}
 
{{Related articles start}}
21行目: 22行目:
 
{{Note|HKP プロトコルは 11371/tcp を使って通信します。(''pacman-key'' を使って) サーバーから署名済みの鍵を取得するには、このポートが開かれている必要があります。}}
 
{{Note|HKP プロトコルは 11371/tcp を使って通信します。(''pacman-key'' を使って) サーバーから署名済みの鍵を取得するには、このポートが開かれている必要があります。}}
   
== 設定 ==
+
== セットアップ ==
   
 
=== pacman の設定 ===
 
=== pacman の設定 ===
   
{{ic|/etc/pacman.conf}} の {{ic|SigLevel}} オプションでパッケージをインストールするときに必要な信頼のレベルを設定できます。{{ic|SigLevel}} について詳しくは {{man|5|pacman.conf}} やファイル内のコメントを見てください。署名のチェックはリポジトリ別に設定したり、全てのリポジトリで共通に設定することが可能です。{{ic|[options]}} セクションで {{ic|SigLevel}} を設定して全てのパッケージに署名を必要とした場合、あなた自身が ''makepkg'' で作成したパッケージにも署名が必要になります。
+
{{ic|/etc/pacman.conf}} の {{ic|SigLevel}} オプションでパッケージをインストールするときに必要な信頼のレベルを設定できます。{{ic|SigLevel}} について詳しくは {{man|5|pacman.conf|PACKAGE AND DATABASE SIGNATURE CHECKING}} やファイル内のコメントを見てください。署名のチェックはリポジトリ別に設定したり、全てのリポジトリで共通に設定することが可能です。{{ic|[options]}} セクションで {{ic|SigLevel}} を設定して全てのパッケージに署名を必要とした場合、あなた自身が ''makepkg'' で作成したパッケージにも署名が必要になります。
   
{{Note|公式のパッケージは全て署名されていますが、20126月現在、データベースの署名は作業途中です。{{ic|Required}} を設定するときは {{ic|DatabaseOptional}} も設定してください。}}
+
{{Note|公式のパッケージは全て署名されていますが、201811月現在、データベースの署名は作業途中です。{{ic|Required}} を設定するときは {{ic|DatabaseOptional}} も設定してください。}}
   
 
デフォルト設定では信頼できる鍵によって署名されたパッケージのみインストールするようになっています:
 
デフォルト設定では信頼できる鍵によって署名されたパッケージのみインストールするようになっています:
45行目: 46行目:
 
Include = /etc/pacman.d/mirrorlist
 
Include = /etc/pacman.d/mirrorlist
   
上記の設定ではリポジトリのパッケージの署名チェック明示的に行われますが、データベースは必ずしも署名を必要としません。上記の {{ic|PackageRequired}} を {{ic|Optional}} とすれば、設定したリポジトリに限り、全体設定の {{ic|Required}} がオフになります。
+
上記ではリポジトリのパッケージの署名チェックを行うように明示的に設定していますが、データベースは必ずしも署名を必要としません。上記の {{ic|Required}} を {{ic|Optional}} とすれば、設定したリポジトリに限り、全体設定の {{ic|Required}} がオフになります。
   
 
{{warning|SigLevel の {{ic|TrustAll}} オプションはデバッグのためのオプションです。検証されていない鍵も簡単に信用するようになります。公式リポジトリでは {{ic|TrustedOnly}} を使うようにしてください。}}
 
{{warning|SigLevel の {{ic|TrustAll}} オプションはデバッグのためのオプションです。検証されていない鍵も簡単に信用するようになります。公式リポジトリでは {{ic|TrustedOnly}} を使うようにしてください。}}
73行目: 74行目:
 
=== 開発者の鍵を追加 ===
 
=== 開発者の鍵を追加 ===
   
公式開発者や TU の鍵はマスター鍵で署名されているため、ユーザーが ''pacman-key'' を使って署名を行う必要はありません。''pacman'' は未確認の鍵を認識したら、{{ic|/etc/pacman.d/gnupg/gpg.conf}} に設定されている {{ic|keyserver}} から鍵をダウンロードします (またはコマンドラインの {{ic|--keyserver}} オプションでサーバーを指定することもできます)。Wikipedia には[[wikipedia:Key server (cryptographic)|鍵サーバー]]のリストがあります。
+
公式開発者や [[Trusted Users|TU]] の鍵はマスター鍵で署名されているため、ユーザーが ''pacman-key'' を使って署名を行う必要はありません。''pacman'' は未確認の鍵を認識したら、{{ic|/etc/pacman.d/gnupg/gpg.conf}} に設定されている {{ic|keyserver}} から鍵をダウンロードします (またはコマンドラインの {{ic|--keyserver}} オプションでサーバーを指定することもできます)。Wikipedia には[[wikipedia:Key server (cryptographic)|鍵サーバー]]のリストがあります。
   
 
開発者の鍵は一度ダウンロードすれば、もう一度ダウンロードする必要はありません。同じ開発者による他のパッケージもダウンロードした鍵で検証することができます。
 
開発者の鍵は一度ダウンロードすれば、もう一度ダウンロードする必要はありません。同じ開発者による他のパッケージもダウンロードした鍵で検証することができます。
85行目: 86行目:
 
まずは鍵の所有者から鍵 ID ({{ic|''keyid''}}) を入手してください。それからキーリングに鍵を追加してください:
 
まずは鍵の所有者から鍵 ID ({{ic|''keyid''}}) を入手してください。それからキーリングに鍵を追加してください:
   
* 鍵サーバーに鍵が存在する場合、以下のコマンドでインポート: {{bc|# pacman-key -r ''keyid''}}
+
# 鍵サーバーに鍵が存在する場合、以下のコマンドでインポート: {{bc|# pacman-key --recv-keys ''keyid''}}
  +
# または、鍵ファイルがダウンロードできる場合、ダウンロードして以下のコマンドを実行: {{bc|# pacman-key --add ''/path/to/downloaded/keyfile''}}
 
* または、鍵ファイルがダウンロードできる場合、ダウンロードして以下のコマンドを実行: {{bc|# pacman-key --add ''/path/to/downloaded/keyfile''}}
 
   
 
マスター鍵など他の鍵と同じように、署名する前にフィンガープリントを確認してください:
 
マスター鍵など他の鍵と同じように、署名する前にフィンガープリントを確認してください:
$ pacman-key -f ''keyid''
+
$ pacman-key --finger ''keyid''
   
 
確認できたら、インポートした鍵をローカルで署名してください:
 
確認できたら、インポートした鍵をローカルで署名してください:
102行目: 102行目:
   
 
# gpg --homedir /etc/pacman.d/gnupg --list-keys
 
# gpg --homedir /etc/pacman.d/gnupg --list-keys
  +
  +
== ヒントとテクニック‎ ==
  +
  +
=== システムの定期的な更新 ===
  +
  +
[[pacman#パッケージのアップグレード]] によるシステムの定期的なアプグレード作業は、たいていの署名に関するエラーの発生を防ぎます。しかし、もしアップグレード作業の時間間隔が長くなってしまう場合には、システムのアップグレードの前に手動でパッケージのデータベースを更新して {{Pkg|archlinux-keyring}} パッケージを先にアップグレードして下さい:
  +
  +
# pacman -Sy archlinux-keyring && pacman -Su
  +
  +
このコマンドは始めにパッケージデータベースを更新した後にキーリングのパッケージをアップグレードするため、 [[システムメンテナンス#部分的なアップグレード|システムの部分的なアップグレード]] は考慮されていません。全てのパッケージの署名が正しく検証されるようにするために、どちらの作業もシステムアップグレードの直前に処理される必要があります。
  +
  +
=== システム時刻の定期的な更新 ===
  +
  +
システム時刻がずれている場合、鍵の署名が期限切れ (や無効) として扱われてしまい署名の検証が失敗することがあります。[[Network Time Protocol daemon]] を使うことによってシステム時刻を定期的に同期するようにして下さい。
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
   
  +
=== 無効な署名によるエラー ===
{{Warning|''pacman-key'' は[[時刻]]に依存しています。システムクロックが間違っている場合、以下のように表示されます:
 
  +
  +
''pacman-key'' は[[時刻|システム時刻]]に依存しています。システムクロックが間違っている場合、以下のように表示されます:
  +
 
error: PackageName: signature from "User <email@archlinux.org>" is invalid
 
error: PackageName: signature from "User <email@archlinux.org>" is invalid
 
error: failed to commit transaction (invalid or corrupted package (PGP signature))
 
error: failed to commit transaction (invalid or corrupted package (PGP signature))
 
Errors occured, no packages were upgraded.
 
Errors occured, no packages were upgraded.
  +
}}
 
  +
{{ic|ntpd}} を使っている場合、ルート権限で {{ic|hwclock -w}} の後に {{ic|ntpd --qg}} を実行してシステム時刻を修正してください。
  +
  +
他の NTP クライアントも使うことができます。その場合は [[時刻#時刻同期|時刻同期]] も参照して下さい。
  +
  +
システム時刻を修正してもエラーを解決できない場合は、下に示す方法を試して下さい。
  +
  +
==== パッケージのキャッシュからの削除 ====
  +
  +
パッケージはダウンロードの途中で壊れる可能性があり、エラーを引き起し得ます。新しくダウンロードするために、{{ic|rm /var/cache/pacman/pkg/''pkgname''}} として問題となっているパッケージをキャッシュから削除して下さい。
  +
  +
==== 全ての鍵のリセット ====
  +
  +
システムにインストールされた全ての鍵を削除・リセットして下さい。root で {{ic|/etc/pacman.d/gnupg}} フォルダを削除し {{ic|pacman-key --init}} を実行して {{ic|pacman-key --populate archlinux}} としてデフォルトの鍵を再度追加してください。
  +
* 動作しない場合は、まず {{ic|pkill gpg-agent}} を試してみてください。
  +
  +
==== 署名チェックの無効化 ====
  +
  +
{{Warning|パッケージ署名を無効化すると ''pacman'' は信頼されていないパッケージをインストールするようになるので注意してください。}}
  +
  +
パッケージの署名について拘りがないのであれば、PGP の署名チェックを完全に無効化することもできます。{{ic|/etc/pacman.conf}} を編集して {{ic|[options]}} の以下の行をアンコメントしてください:
  +
  +
SigLevel = Never
  +
  +
リポジトリごとの SigLevel の設定は全てコメントアウトしてください。上記の設定よりも優先して使われるためです。設定を行うと pacman 4 以前の署名チェックが全くない状態と同じになります。署名チェックを無効化する場合、''pacman-key'' でキーリングを設定する必要もありません。署名チェックのオプションはいつでも後から変更することができます。
   
 
=== 鍵をインポートできない ===
 
=== 鍵をインポートできない ===
120行目: 161行目:
 
* ''pacman'' のキャッシュに以前使用した未署名のパッケージが残っている。
 
* ''pacman'' のキャッシュに以前使用した未署名のパッケージが残っている。
 
* {{ic|dirmngr}} が正しく設定されていない。
 
* {{ic|dirmngr}} が正しく設定されていない。
  +
* 長い間アップグレードをしておらず、gpg/pacman がうまく対処できていない。
   
{{Pkg|archlinux-keyring}} パッケージが古いとアップグレードの同期時に止まってしまうことがあります。[[Pacman#パッケージのアップグレード|システムのアップグレード]]によって問題が解決しないか試してみてください
+
{{Pkg|archlinux-keyring}} パッケージが古いとアップグレードの同期時に止まってしまうことがあります。
   
  +
以下にいくつかの解決策を示します。
システムを更新しても問題が解決せず時刻も間違っていない場合、MIT の鍵サーバーに切り替えてみる方法があります。MIT のサーバーは別のポートを提供しています。{{ic|/etc/pacman.d/gnupg/gpg.conf}} を編集して {{ic|keyserver}} 行を以下のように変更してください:
 
   
  +
==== システムのアップグレード ====
keyserver hkp://pgp.mit.edu:11371
 
   
  +
まず始めに、[[pacman#パッケージのアップグレード]] を試してみて下さい。
80番ポートも使えない場合 (例えば会社が透過的なプロキシを使っている場合など)、以下の設定で解決するかもしれません:
 
   
  +
==== 鍵サーバーの変更 ====
keyserver hkps://hkps.pool.sks-keyservers.net:443
 
   
  +
鍵サーバーの不調が疑われる場合は、Ubuntu の鍵サーバーに切り替えてみる事を試してみて下さい。{{ic|/etc/pacman.d/gnupg/gpg.conf}} を編集して {{ic|keyserver}} 行を以下のように変更してください:
[[IPv6]] を無効化している場合、IPv6 アドレスが発見されると ''gpg'' はインポートに失敗します。そのようなときは IPv4 のみに対応している鍵サーバーを試してみてください:
 
   
keyserver hkp://ipv4.pool.sks-keyservers.net:11371
+
keyserver hkp://keyserver.ubuntu.com
   
  +
==== パッケージキャッシュの削除 ====
そのほかに {{ic|pacman-key --populate archlinux}} を実行していないと鍵のインポート時にエラーが表示されることがあります。
 
   
上記の解決方法が全く役に立たない場合、{{ic|/var/cache/pacman/pkg/}} に存在する ''pacman'' のキャッシュに署名パッケージが含まれている可能性あります。キャッシュを手動で消去す以下コマンドを実行してインストールしていないパッケージのキャッシュを全て削除してください:
+
{{ic|/var/chache/pacman/pkg/}} pacman のキャッシュに署名されていないパッケージが含まれている疑われ場合ようにしてキャッシュを全て削除してみて下さい:
   
 
# pacman -Sc
 
# pacman -Sc
   
  +
これによってインストールされていないパッケージのキャッシュを全て削除します。
=== 署名チェックの無効化 ===
 
 
{{Warning|パッケージ署名を無効化すると ''pacman'' は無秩序に信頼されていないパッケージをインストールするようになるので注意してください。}}
 
 
パッケージの署名について拘りがないのであれば、PGP の署名チェックを完全に無効化することもできます。{{ic|/etc/pacman.conf}} を編集して {{ic|[options]}} の以下の行をアンコメントしてください:
 
 
SigLevel = Never
 
 
リポジトリごとの SigLevel の設定は全てコメントアウトしてください。上記の設定よりも優先して使われるためです。設定を行うと pacman 4 以前の署名チェックが全くない状態と同じになります。署名チェックを無効化する場合、''pacman-key'' でキーリングを設定する必要もありません。署名チェックのオプションはいつでも後から変更することができます。
 
   
=== の鍵のリセット ===
+
==== 信頼されいない不明な署名 ====
   
  +
{{ic|pacman -Suy}} を実行すると、次のエラーが発生する場合があります。
システムにインストールされた全ての鍵を削除・リセットしたい場合、root で {{ic|/etc/pacman.d/gnupg}} フォルダを削除し {{ic|pacman-key --init}} を再度実行してから上の記述に従って鍵を追加してください。
 
   
  +
error: ''package-name'': signature from "''packager''" is unknown trust
=== 古いパッケージの削除 ===
 
   
  +
これは、パッケージ {{ic|''package-name''}} で使用されている {{ic|''packager''}} の鍵が存在しないか、ローカルの pacman-key のデータベースで信頼されていないために発生します。 pacman は鍵が受信され、信頼できるものとしてマークされているかどうかを常に確認できるとは限りません。 これは、キーチェーンに追加されてから鍵の有効期限が切れていることによる可能性もあります。
同じパッケージが署名チェックに失敗し続けていて、''pacman-key'' に関することを全て正しく行っている場合、{{ic|rm /var/cache/pacman/pkg/''badpackage''*}} を実行するなどしてパッケージを一度削除してから新しくダウンロードしてみてください。
 
   
  +
対応策としては以下の通りです:
アップグレードの際に {{ic|error: linux: signature from "Some Person <Some.Person@example.com>" is invalid}} とメッセージが表示される場合、削除によって解決することが実際にあります (つまり、あなたは MITM 攻撃の犠牲者などではなく、単にダウンロードしたファイルが壊れていたということです)。
 
  +
* {{ic|pacman-key --refresh-keys}} を使用して鍵を更新する、または
  +
* [[#非公式な鍵を追加|ローカルで信頼できない鍵を手動で署名する]] または
  +
* [[#全ての鍵のリセット|すべての鍵をリセットする]]
  +
* 一時的に {{ic|SigLevel}} を {{ic|TrustAll}} に変更する。ただし推奨しません。
   
 
=== プロキシを使って鍵をアップデート ===
 
=== プロキシを使って鍵をアップデート ===
169行目: 207行目:
 
== 参照 ==
 
== 参照 ==
   
  +
* [[DeveloperWiki:パッケージの署名]]
 
* [http://allanmcrae.com/2011/08/pacman-package-signing-1-makepkg-and-repo-add/ Pacman Package Signing – 1: Makepkg and Repo-add]
 
* [http://allanmcrae.com/2011/08/pacman-package-signing-1-makepkg-and-repo-add/ Pacman Package Signing – 1: Makepkg and Repo-add]
 
* [http://allanmcrae.com/2011/08/pacman-package-signing-2-pacman-key/ Pacman Package Signing – 2: Pacman-key]
 
* [http://allanmcrae.com/2011/08/pacman-package-signing-2-pacman-key/ Pacman Package Signing – 2: Pacman-key]

2023年5月9日 (火) 13:47時点における最新版

関連記事

パッケージが本物かどうか判断するために、pacman信頼の輪 モデルに則った GnuPG 鍵 を使用します。最新のマスター署名鍵は こちら から確認できます。開発者や Trusted User の鍵を署名するときはマスター署名鍵が最低でも3つ以上使うことになっています。開発者や Trusted User が作成したパッケージはマスター署名鍵によって署名された鍵によって署名されます。開発者だけでなくユーザーもそれぞれ PGP 鍵を持っており、pacman-key のセットアップ時に生成されます。信頼の輪によってユーザーの鍵からマスター鍵までひとつなぎで繋がります。

信頼の輪の例:

  • カスタムパッケージ: 自分で作ったパッケージに自分の鍵で署名します。
  • 非公式パッケージ: 他のユーザーがパッケージを作成して署名します。ユーザーはユーザーの鍵でパッケージ作成者の鍵に署名します。
  • 公式パッケージ: 開発者がパッケージを作成して署名します。開発者の鍵は Arch Linux のマスター鍵で署名されています。ユーザーはユーザーの鍵でマスター鍵に署名することで、開発者の鍵で署名されたパッケージを間接的に信用します。
ノート: HKP プロトコルは 11371/tcp を使って通信します。(pacman-key を使って) サーバーから署名済みの鍵を取得するには、このポートが開かれている必要があります。

セットアップ

pacman の設定

/etc/pacman.confSigLevel オプションでパッケージをインストールするときに必要な信頼のレベルを設定できます。SigLevel について詳しくは pacman.conf(5) § PACKAGE AND DATABASE SIGNATURE CHECKING やファイル内のコメントを見てください。署名のチェックはリポジトリ別に設定したり、全てのリポジトリで共通に設定することが可能です。[options] セクションで SigLevel を設定して全てのパッケージに署名を必要とした場合、あなた自身が makepkg で作成したパッケージにも署名が必要になります。

ノート: 公式のパッケージは全て署名されていますが、2018年11月現在、データベースの署名は作業途中です。Required を設定するときは DatabaseOptional も設定してください。

デフォルト設定では信頼できる鍵によって署名されたパッケージのみインストールするようになっています:

/etc/pacman.conf
SigLevel = Required DatabaseOptional

デフォルトの pacman のパラメータは TrustedOnly となっているため、上記の設定は全体的に以下のように設定したのと同じです:

SigLevel = Required DatabaseOptional TrustedOnly

上記と同じ設定をリポジトリ別で行うには以下のように設定します:

[core]
SigLevel = PackageRequired
Include = /etc/pacman.d/mirrorlist

上記ではリポジトリのパッケージの署名チェックを行うように明示的に設定していますが、データベースは必ずしも署名を必要としません。上記の RequiredOptional とすれば、設定したリポジトリに限り、全体設定の Required がオフになります。

警告: SigLevel の TrustAll オプションはデバッグのためのオプションです。検証されていない鍵も簡単に信用するようになります。公式リポジトリでは TrustedOnly を使うようにしてください。

キーリングの初期化

pacman のキーリングをセットアップするには:

# pacman-key --init

初期化にはエントロピーが必要です。マウスを動かしたり、キーボードでランダムに文字列を打ち込んだり、ディスク操作を伴うユーティリティを実行 (例えば別のコンソールで ls -R /, find / -name foo, dd if=/dev/sda8 of=/dev/tty7 などを実行) したりしてエントロピーを生成してください。システムに十分なエントロピーが溜まっていない場合、初期化が完了するまで何時間もかかります。積極的にエントロピーを生成することで、素早く初期化を終わらせることができます。

生成したエントロピーはキーリング (/etc/pacman.d/gnupg) や GPG 署名鍵のセットアップに使われます。

ノート: (ヘッドレスサーバーなど) エントロピーがあまり生成できないコンピュータで pacman-key --init を実行すると、鍵の生成に長い時間がかかります。pacman-key --init を実行する前に、マシンに haveged または rng-tools をインストールしてそれぞれのサービスを起動することで擬似的にエントロピーを生成することが可能です。

キーリングの管理

マスター鍵の検証

以下のコマンドで鍵の初期設定を行います:

# pacman-key --populate archlinux

マスター署名鍵 は全ての他のパッケージ作成者の鍵に連署するのに使われるため、時間をかけて検証してください。

PGP 鍵は人間が使うには長すぎる (2048ビット以上) ため、大抵はハッシュ化された40桁の16進数のフィンガープリントを使って鍵が等しいかどうか確かめます。フィンガープリントの末尾8桁は鍵の名前として使われ、'(短い) 鍵 ID' と呼ばれます (同じくフィンガープリントの末尾16桁は '長い鍵 ID' です)。

開発者の鍵を追加

公式開発者や TU の鍵はマスター鍵で署名されているため、ユーザーが pacman-key を使って署名を行う必要はありません。pacman は未確認の鍵を認識したら、/etc/pacman.d/gnupg/gpg.conf に設定されている keyserver から鍵をダウンロードします (またはコマンドラインの --keyserver オプションでサーバーを指定することもできます)。Wikipedia には鍵サーバーのリストがあります。

開発者の鍵は一度ダウンロードすれば、もう一度ダウンロードする必要はありません。同じ開発者による他のパッケージもダウンロードした鍵で検証することができます。

ノート: (pacman の依存パッケージとなっている) archlinux-keyring パッケージには最新の鍵が含まれていますが、(root で) pacman-key --refresh-keys を使って手動で鍵を更新することができます。--refresh-keys の実行時、ローカルの鍵もリモートの鍵サーバーに存在しないか調べられるため、鍵が見つからないというメッセージが表示されますが気にする必要はありません。

非公式な鍵を追加

pacman のキーリングに自分の鍵を追加したり、署名されている非公式ユーザーリポジトリを使うときに以下の操作で鍵を追加できます。

まずは鍵の所有者から鍵 ID (keyid) を入手してください。それからキーリングに鍵を追加してください:

  1. 鍵サーバーに鍵が存在する場合、以下のコマンドでインポート:
    # pacman-key --recv-keys keyid
  2. または、鍵ファイルがダウンロードできる場合、ダウンロードして以下のコマンドを実行:
    # pacman-key --add /path/to/downloaded/keyfile

マスター鍵など他の鍵と同じように、署名する前にフィンガープリントを確認してください:

$ pacman-key --finger keyid

確認できたら、インポートした鍵をローカルで署名してください:

# pacman-key --lsign-key keyid

これで上記の鍵で署名されたパッケージを信頼するようになります。

gpg によるデバッグ

以下のように gpg を使って直接 pacman のキーリングにアクセスすることもできます:

# gpg --homedir /etc/pacman.d/gnupg --list-keys

ヒントとテクニック‎

システムの定期的な更新

pacman#パッケージのアップグレード によるシステムの定期的なアプグレード作業は、たいていの署名に関するエラーの発生を防ぎます。しかし、もしアップグレード作業の時間間隔が長くなってしまう場合には、システムのアップグレードの前に手動でパッケージのデータベースを更新して archlinux-keyring パッケージを先にアップグレードして下さい:

# pacman -Sy archlinux-keyring && pacman -Su

このコマンドは始めにパッケージデータベースを更新した後にキーリングのパッケージをアップグレードするため、 システムの部分的なアップグレード は考慮されていません。全てのパッケージの署名が正しく検証されるようにするために、どちらの作業もシステムアップグレードの直前に処理される必要があります。

システム時刻の定期的な更新

システム時刻がずれている場合、鍵の署名が期限切れ (や無効) として扱われてしまい署名の検証が失敗することがあります。Network Time Protocol daemon を使うことによってシステム時刻を定期的に同期するようにして下さい。

トラブルシューティング

無効な署名によるエラー

pacman-keyシステム時刻に依存しています。システムクロックが間違っている場合、以下のように表示されます:

error: PackageName: signature from "User <email@archlinux.org>" is invalid
error: failed to commit transaction (invalid or corrupted package (PGP signature))
Errors occured, no packages were upgraded.

ntpd を使っている場合、ルート権限で hwclock -w の後に ntpd --qg を実行してシステム時刻を修正してください。

他の NTP クライアントも使うことができます。その場合は 時刻同期 も参照して下さい。

システム時刻を修正してもエラーを解決できない場合は、下に示す方法を試して下さい。

パッケージのキャッシュからの削除

パッケージはダウンロードの途中で壊れる可能性があり、エラーを引き起し得ます。新しくダウンロードするために、rm /var/cache/pacman/pkg/pkgname として問題となっているパッケージをキャッシュから削除して下さい。

全ての鍵のリセット

システムにインストールされた全ての鍵を削除・リセットして下さい。root で /etc/pacman.d/gnupg フォルダを削除し pacman-key --init を実行して pacman-key --populate archlinux としてデフォルトの鍵を再度追加してください。

  • 動作しない場合は、まず pkill gpg-agent を試してみてください。

署名チェックの無効化

警告: パッケージ署名を無効化すると pacman は信頼されていないパッケージをインストールするようになるので注意してください。

パッケージの署名について拘りがないのであれば、PGP の署名チェックを完全に無効化することもできます。/etc/pacman.conf を編集して [options] の以下の行をアンコメントしてください:

SigLevel = Never

リポジトリごとの SigLevel の設定は全てコメントアウトしてください。上記の設定よりも優先して使われるためです。設定を行うと pacman 4 以前の署名チェックが全くない状態と同じになります。署名チェックを無効化する場合、pacman-key でキーリングを設定する必要もありません。署名チェックのオプションはいつでも後から変更することができます。

鍵をインポートできない

鍵がインポートできない原因は複数考えられます:

  • archlinux-keyring パッケージが古くなっている。
  • 現在時刻が間違っている。
  • 使用している ISP によって PGP 鍵のインポートに必要なポートが塞がれている。
  • pacman のキャッシュに以前使用した未署名のパッケージが残っている。
  • dirmngr が正しく設定されていない。
  • 長い間アップグレードをしておらず、gpg/pacman がうまく対処できていない。

archlinux-keyring パッケージが古いとアップグレードの同期時に止まってしまうことがあります。

以下にいくつかの解決策を示します。

システムのアップグレード

まず始めに、pacman#パッケージのアップグレード を試してみて下さい。

鍵サーバーの変更

鍵サーバーの不調が疑われる場合は、Ubuntu の鍵サーバーに切り替えてみる事を試してみて下さい。/etc/pacman.d/gnupg/gpg.conf を編集して keyserver 行を以下のように変更してください:

keyserver hkp://keyserver.ubuntu.com

パッケージキャッシュの削除

/var/chache/pacman/pkg/ の pacman のキャッシュに署名されていないパッケージが含まれている事が疑われる場合、次のようにしてキャッシュを全て削除してみて下さい:

# pacman -Sc

これによってインストールされていないパッケージのキャッシュを全て削除します。

信頼されていない不明な署名

pacman -Suy を実行すると、次のエラーが発生する場合があります。

error: package-name: signature from "packager" is unknown trust

これは、パッケージ package-name で使用されている packager の鍵が存在しないか、ローカルの pacman-key のデータベースで信頼されていないために発生します。 pacman は鍵が受信され、信頼できるものとしてマークされているかどうかを常に確認できるとは限りません。 これは、キーチェーンに追加されてから鍵の有効期限が切れていることによる可能性もあります。

対応策としては以下の通りです:

プロキシを使って鍵をアップデート

鍵の更新時にプロキシを使うには /etc/gnupg/dirmngr.conf/etc/pacman.d/gnupg/dirmngr.conf の両方で honor-http-proxy オプションを設定してください。詳しくは GnuPG#鍵サーバーを使用するを参照。

ノート: honor-http-proxy オプションを使わずに pacman-key を使用していて更新に失敗する場合、再起動することで問題が解決する場合があります。

参照