LoginSignup
4
4

More than 1 year has passed since last update.

LinuxでSSL証明書のエラーが出たときに試したこと (wget, Python)

Last updated at Posted at 2021-07-28

普段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 - wget

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にまとめました。
今後このようなことがあった場合に役立つことができれば幸いです。

4
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4