🤔
Let's Encryptで認証されているSlackサーバーへのcurlがエラーになるときの対処法
環境
- 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」であることを確認
-
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