6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Python の Slackチャットボット (slackbot) が `SSL: CERTIFICATE_VERIFY_FAILED` で起動しなくなった問題の解決

Posted at

経緯

  • Python パッケージ https://github.com/scrapinghub/slackbot を使って、EC2インスタンス上でSlackのチャットボットを起動し利用していました。
  • しかし、2023年3月14日の夜あたりから、突然 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1125) というエラーを出し起動しなくなってしまいました。
  • Slack が https://status.slack.com/2023-03/9011b8a984a74042 のとおり Incident を報告してくれていますが、解決策はこの記事を書いている現時点(3月18日0時)では提供されていませんでした。
  • SSL: CERTIFICATE_VERIFY_FAILED に関してウェブ上で調べて、再び動くようにすることができたので、その方法を共有します。

解決策

WEBSOCKET_CLIENT_CA_BUNDLE=$(python -c "import ssl;print(ssl.get_default_verify_paths().openssl_cafile)")

のように環境変数に設定した上でSlackbotを起動させれば、エラーがなくなりました。

なぜこれで起動するようになるのか?

  • slackbot は内部で https://github.com/websocket-client/websocket-client を利用している
  • websocket-client は独自のルート証明書をバンドルして提供しているらしい(参考
  • 3月14日頃にSlack側でSSL証明書の更新が行われ、何らかの理由によりそれが websocket-clientがバンドルしている独自のルート証明書では検証できなくなったのではないか?
  • python -c "import ssl;print(ssl.get_default_verify_paths().openssl_cafile)" を実行すると、サーバーのOpenSSLにハードコードされたcafileのパスを取得することができる
  • それを WEBSOCKET_CLIENT_CA_BUNDLE に指定することで、 websocket-client が(独自のルート証明書ではなく)OpenSSLのcafileを見るようになる
  • OpenSSLの方ではSlackのSSL証明書の検証に成功するのでこれで解決する

ということだと思っています(たぶん)

上記解決策に至るまでにやっていたこと

(もしかしたらこの作業も影響しているのかもしれないので、念のため共有しておきます)

6
0
0

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
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?