導入
wget を実行するときに下記のような証明書関連のエラーによく出くわします。
$ wget -O - https://www.ana.co.jp/
--2015-07-21 21:27:18-- https://www.ana.co.jp/
www.ana.co.jp (www.ana.co.jp) をDNSに問いあわせています... 23.34.96.213
www.ana.co.jp (www.ana.co.jp)|23.34.96.213|:443 に接続しています... 接続しました。
エラー: www.ana.co.jp の証明書(発行者: `/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 EV SSL CA - G2')の検証に失敗しました:
発行者の権限を検証できませんでした。
www.ana.co.jp に安全の確認をしないで接続するには、`--no-check-certificate' を使ってください。
(ロケールが英語の場合)
$ LANG=C wget -O - https://www.ana.co.jp/
--2015-07-21 21:30:03-- https://www.ana.co.jp/
Resolving www.ana.co.jp (www.ana.co.jp)... 23.34.96.213
Connecting to www.ana.co.jp (www.ana.co.jp)|23.34.96.213|:443... connected.
ERROR: cannot verify www.ana.co.jp's certificate, issued by '/C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 EV SSL CA - G2':
Unable to locally verify the issuer's authority.
To connect to www.ana.co.jp insecurely, use `--no-check-certificate'.
ここで
$ wget -O - https://www.ana.co.jp/ --no-check-certificate
とするのは、ダサいです。
HTTPS なんだから、ちゃんと発行者を検証したいですよね。
そもそも一度怒られてからなんとかするのは、二度手間です。イライラします。
対応方法
下記の手順で対応しました。
実行した環境は CentOS7 前提ですが、ほかの環境でも似たような手順で解決できると思います。
それっぽい CA 情報をごった煮させた上で、 wget のデフォルト設定に加えるというアプローチです。もっといい方法があればだれか教えてください。
Curl の CA 情報を取得
$ wget -q -O $HOME/.cacert.pem http://curl.haxx.se/ca/cacert.pem
Firefox の CA 情報を追加
Curl の CA 情報は Firefox の情報を元に変換しているので、おそらく内容重複している???
この手順は不要???
$ rpm -ql ca-certificates | fgrep .pem | xargs cat >> $HOME/.cacert.pem
Rubygems の CA 情報を追加
$ rpm -ql rubygems | fgrep .pem | xargs cat >> $HOME/.cacert.pem
手元のローカルの Firefox の DB を抽出
さらにダメ元で、ローカルの Firefox の証明書情報を抽出。
一部の HTTPS サイトはこの手順を経ないとダメだった。
$ for db in ~/.mozilla/firefox/*.default*/; do
certutil -L -h "Buildin Object Token" -d $db | \
awk -F " " '!/^Certificate Nickname/{print $1}' | \
xargs -l -inickname certutil -d $db -L -n nickname -a ;
done >> $HOME/.cacert.pem
.wgetrc を修正
echo ca-certificate = $HOME/.cacert.pem >> $HOME/.wgetrc
wget を実行
$ wget https://www.ana.co.jp/ ### 証明書のエラーなく正しく実行できる