普段Ubuntu Serverでいろいろやっています。
ある日突然サーバーでwgetが使えなくなりました。
$ wget https://xxxxxx.jp/
--2021-07-28 15:11:11-- https://xxxxxx.jp/
Resolving xxxxxx.jp (xxxxxx.jp)...
Connecting to xxxxxx.jp (xxxxxx.jp)|xxxxxxxx|:443... connected.
ERROR: cannot verify xxxxxx.jp's certificate, issued by ‘CN=GeoTrust RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US’:
Unable to locally verify the issuer's authority.
To connect to xxxxxx.jp insecurely, use `--no-check-certificate'.
SSL証明書のエラーが出てしまったのです。
最初はこのサイトだけかと思って、いろいろなサイトへ試しに接続しようとしたらそれらもみんなダメ。
そうこうしているうちに、サーバー利用者から「PythonでSSLエラーが出る」という報告を受けました。
どうやらwget以外でも影響がでているようなのです。
Pythonでの対処
とりあえずPythonの方を解決しようといろいろ調べると SSL_CERT_FILE
という環境変数にCA証明書ファイルを指定するとよいという記載があったため、それに従って設定したところ、解決することができました。
PythonではCA証明書を持っているcertifiモジュールがあるため、そのモジュールが持っている証明書ファイルのパスを環境変数にセットしました。
ファイルパスは、python3 -m certifi
で知ることができます。
$ python3 -m certifi
/usr/local/lib/python3.8/dist-packages/certifi/cacert.pem
$ echo SSL_CERT_FILE=/usr/local/lib/python3.8/dist-packages/certifi/cacert.pem >> $HOME/.bashrc
$ source $HOME/.bashrc # 環境変数読み込み
wgetでの解決方法
wgetに至ってはなかなか解決ができず、試行錯誤しつつ調べを進めると、wgetがどこのCA証明書ファイルを読みに行っているかを知ると早いと言っている記事を見つけました。
Cygwinなので一見関係ないように見えましたが、この方法で解決しました。
まずstraceコマンドでwgetがどんなファイルを読んでいるのか調べます。
すると、このようなログが。
$ strace wget https://xxxxxx.jp/ | grep ssl
...
stat("/usr/local/ssl/certs/968d05c4.0", 0x7ffd21dd5a00) = -1 ENOENT (No such file or directory)
stat("/usr/local/ssl/certs/3513523f.0", 0x7ffd21dd5a00) = -1 ENOENT (No such file or directory)
stat("/usr/local/ssl/certs/3513523f.0", 0x7ffd21dd5a00) = -1 ENOENT (No such file or directory)
stat("/usr/local/ssl/certs/e4af4c8e.0", 0x7ffd21dd59b0) = -1 ENOENT (No such file or directory)
なんと /usr/local/ssl/certsのファイルを読みに行っていました。
そのディレクトリの中身を見ると空でした。
$ ls /usr/local/ssl/certs
これでモヤモヤが解決されました。
CA証明書は自分の環境では /etc/ssl/certs にあるため、シンボリックリンクを貼って対処します。
$ sudo rm -rf /usr/local/ssl/certs
$ sudo ln -s /etc/ssl/certs /usr/local/ssl/certs
再度wgetを試すと、エラーは解消できました。
同時にPythonでのエラーもなくなり、環境変数の設定が不要になりました。
最後に
ca-certificatesをインストールする等では解決できないレアな事象であったため、今回Qiitaにまとめました。
今後このようなことがあった場合に役立つことができれば幸いです。