🤔

Let's Encryptで認証されているSlackサーバーへのcurlがエラーになるときの対処法

2023/03/16に公開

環境

  • Amazon EC2
  • Ubuntu 16.04.6 LTS

症状

  • PHPからcurlを使いSlackへ通知を送る仕組みが機能しない
  • PHPのエラーログを見てみるとcurlが失敗していることがわかる
cURL error 60: SSL certificate problem: certificate has expired
  • curl https://slack.com/を実行すると以下のエラーが出る
$ curl https://slack.com/
curl: (60) server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
  • OpenSSLコマンドを実行しようとするとcertificate has expiredとエラーが出る
$ openssl s_client -connect slack.com:443
CONNECTED(00000003)
depth=3 O = Digital Signature Trust Co., CN = DST Root CA X3
verify error:num=10:certificate has expired
notAfter=Sep 30 14:01:15 2021 GMT

追記(2023/3/16)

AWSのドキュメントに解決方法の記載がありました。
上記の方法の方が、根本的な解決になると思われます。
以下の方法は、上記のドキュメントを試してもエラーが出る際にお試しください。

試したこと

  • ルート証明書の更新
$ sudo apt-get update
$ sudo apt-get install ca-certificates
$ sudo update-ca-certificates

現象変わらず。

調べたこと

  • 手元の端末のChromeでSlackにアクセス
  • Let's Encryptを利用していることと、ルート証明書が「ISRG_Root_X1」であることを確認

Slack.comの証明書

  • less /etc/ca-certificates.confをすると次のように対象の証明書が入っていることがわかる
(前略)
mozilla/ISRG_Root_X1.crt
(後略)
  • 検索するとこのような情報が見つかる
    • 要約すると「DST_Root_CA_X3」という古い証明書のせいでLet's Encryptへの認証が失敗しているとのこと
  • less /etc/ca-certificates.confをすると次のように古い証明書が入っていることがわかる
(前略)
mozilla/DST_Root_CA_X3.crt
(後略)

対処法

  • vimで/etc/ca-certificates.confファイルを編集し古いルート証明書を無効化する
$ vim /etc/ca-certificates.conf

Before

(前略)
mozilla/DST_Root_CA_X3.crt
(後略)

After

(前略)
!mozilla/DST_Root_CA_X3.crt
(後略)
  • ルート証明書を下記コマンドで更新し証明書が削除されたことを確認する
$ sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
0 added, 1 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
  • curl / OpenSSLコマンドでも接続に問題ないことを確認
$ curl https://slack.com/
$ openssl s_client -connect slack.com:443
CONNECTED(00000003)

お疲れさまでした!!!

Discussion