pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


OpenWRT で wget パッケージを入れると、パッケージインストールや更新が行えなくなるのを解決する

ある日気がついてみると openwrt でパッケージの更新が行えなくなっておりました。たとえばこんな感じ。

root@OpenWrt:~# opkg update
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/base/Packages.gz.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/base/Packages.sig.
Signature check failed.
Remove wrong Signature file.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/luci/Packages.gz.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/luci/Packages.sig.
Signature check failed.
Remove wrong Signature file.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/packages/Packages.gz.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/packages/Packages.sig.
Signature check failed.
Remove wrong Signature file.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/routing/Packages.gz.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/routing/Packages.sig.
Signature check failed.
Remove wrong Signature file.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/telephony/Packages.gz.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/telephony/Packages.sig.
Signature check failed.
Remove wrong Signature file.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/management/Packages.gz.
Downloading http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/management/Packages.sig.
Signature check failed.
Remove wrong Signature file.
Collected errors:
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/base/Packages.gz, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/base/Packages.sig, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/luci/Packages.gz, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/luci/Packages.sig, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/packages/Packages.gz, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/packages/Packages.sig, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/routing/Packages.gz, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/routing/Packages.sig, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/telephony/Packages.gz, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/telephony/Packages.sig, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/management/Packages.gz, wget returned 5.
 * opkg_download: Failed to download http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/management/Packages.sig, wget returned 5.
root@OpenWrt:~#

で、調べてみると、Signature のダウンロードがダメな感じです。具体的な状況は「http での接続が https にリダイレクトされた挙句、wget で証明書の検証エラーが出てダウンロードに失敗する」というものです。

root@OpenWrt:~# wget http://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/management/Packages.sig
URL transformed to HTTPS due to an HSTS policy
--2016-08-19 07:55:55--  https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages/management/Packages.sig
Resolving downloads.openwrt.org... 78.24.191.177
Connecting to downloads.openwrt.org|78.24.191.177|:443... connected.
ERROR: cannot verify downloads.openwrt.org's certificate, issued by 'CN=COMODO RSA Domain Validation Secure Server CA,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB':
  Unable to locally verify the issuer's authority.
To connect to downloads.openwrt.org insecurely, use `--no-check-certificate'.
root@OpenWrt:~#

この原因は wgetbusybox のものではなく、単体パッケージに入れ替えていることにあります。

かといって busybox に戻すのも微妙に不愉快です。そこで本件事象を考えうる限りで適切と思われる方法で解決してみることにします。
そもそも最悪なやりかたは --no-check-certificate を付与する方法です。https の目的は接続先サイトが正しい事を検証しつつ通信を暗号化することにあります。しかし --no-check-certificate を付与すると証明書を検証しないので、https にする意味は通信が暗号化されることしかありません。

さて OpenWRT のサイトでは COMODO の証明書を使っていることが wget のメッセージからわかりますので、COMODO の root CA 証明書を探してみることにします。rootCA COMODO のようなキーワードで探してゆくと、以下のような一覧ページにたどり着きます。
Knowledgebase - Powered by Kayako Help Desk Software

ここでは、このリストの中の AddTrustExternalCARoot をダウンロードしてみます。ダウンロード作業は「コモドのサイトにアクセスしても証明書のエラーが出ないブラウザ」を使って行います。

ダウンロードしたファイルは OpenWRT の /etc/rootca.pem として保存しておきます。

そして、wgetrc を以下のように設定します。

root@OpenWrt:~# cat /etc/wgetrc 
ca-certificate = /etc/rootca.pem

これにより wget 実行時のユーザアカウントによらず /etc/rootca.pem が必ず参照されるようになります。