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:~#
この原因は wget を busybox のものではなく、単体パッケージに入れ替えていることにあります。
かといって 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 が必ず参照されるようになります。