Menu
Menu
Blog
ブログ
About Site
サイトについて
Profile
プロフィール
Activity
活動
Works
制作
Contact
お問い合わせ
音ゲー好きなエンジニアの個人事務所。気ままにブログを更新しています。
Otogeworks
  • Blogブログ
  • About Siteサイトについて
  • Profileプロフィール
  • Activity活動
  • Works制作
  • Contactお問い合わせ

有効な証明書なのにcertificate has expiredになる件

2022 6/25
Web
2022年6月25日

サーバー上のPHPからcURLで外部APIを叩いた時に起こりました。
HTTPのテスト系APIで動作確認した後、HTTPSの本番系APIに切り替えると以下のエラーが返ってきました。

curl: (60) The certificate issuer's certificate has expired.  Check your system date and time.

クライアントのWebブラウザから、HTTPSの本番系に正常に接続できていることは確認済みです。
つまりSSL証明書が有効なので、certificate has expired=証明書の有効期限切れではないことは明白です。

試しにサーバー内に入って直接curlコマンドを打ってみます。

[vagrant@dev ~]$ curl https://something.com/
curl: (60) The certificate issuer's certificate has expired.  Check your system date and time.
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

ここで確認しなければならないことは「サーバーの時刻が同期されているか?」です。
(エラーメッセージにも書いてあります)

当たり前ですが、証明書の有効期限切れの判定にはシステム時刻を使用しています。
そのためサーバーの時刻を合わせる必要があります。

NTPが設定されているかどうかを確認し、されていなければ設定しましょう。

しかし、私のパターンではサーバーの時刻も合っていました。

目次

ルートCA証明書が失効している

以下のコマンドでca-certificatesパッケージを更新することで解決できました。

sudo yum update ca-certificates

更新前

[vagrant@dev ~]$ yum list installed | grep ca-certificates
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
ca-certificates.noarch                2015.2.4-70.0.el7_1            @updates  

更新後

[vagrant@dev ~]$ yum list installed | grep ca-certificates
ca-certificates.noarch                2021.2.50-72.el7_9             @updates  

2015年のパッケージから更新されていなかったようですね。

ちなみにyum updateすら証明書エラーになってしまう場合は、別な手段でca-certificatesパッケージを取得してインストールする必要があります。

なぜ解決したのか?

時は遡ること2021年9月30日。
この日にLet’s Encryptが使用しているDST Root CA X3という証明書の有効期限が切れました。

ZDNet Japan
Let's EncryptのルートCA証明書期限切れ、多数のサイトで問題発生 HTTPSに使用する証明書を無料で発行しているLet's Encryptが使用しているルート証明書が期限切れになったことで、多くのサイトで問題が発生している。

この影響で古い環境では証明書エラーが発生してしまいます。
Let’s EncryptのルートCA証明書は新しい証明書に更新されていますが、それに対応した証明書を端末にインストールしておかなければ、端末は新しい証明書を認識できません。

こんなルート証明書知らん!

と認識してしまうのですね。

そしてAPIのSSL証明書も、このLet’s Encryptを使っていました。

クライアントであれば、Windows UpdateなどのOSアップデートにあたる更新を行っていれば問題ありません。
サーバーでも同じで、今回のケースでもyum updateを行っていれば問題は起きていませんでした。

しかし長らくyum updateしていなかったため、ルートCA証明書が入っているca-certificatesパッケージが古いままになっていたのです。

余談

PHPプログラムにはJavaScriptのXMLHttpRequestでアクセスしており、エラーが発生した場合はcURLのステータスコードをJSONで返すようにしていました。

そして返ってきたcURLのステータスコードはなぜか0。
お前誰やねん。100番台のステータスコードすら見たことないのに

ちょっとハマりかけましたが、cURLのエラーメッセージを吐き出すようにしたら冒頭のメッセージが出現。
状況的にルートCA証明書絡みなのかなぁと思ったらビンゴでした。

Web
ushui
宮城県生まれのエンジニアです。
都内でフリーランスを営んでいます。
カレーと音ゲーが好き。
最近の投稿
  • CRI Assets/AddressablesでCriAtomExPlayerを使って再生2022年8月15日
  • WordPress REST APIのセキュリティが脆弱という誤解2022年7月31日
  • Noto Sans CJK(中国語/日本語/韓国語)の丸ゴシック体を探す旅2022年7月25日
  • 機種変更に失敗して消えたLINEのトークをワンチャン復元する2022年7月4日
  • WorkSpacesをWindows、Mac、Chrome OSで1年使った感想2022年6月26日
カテゴリー
アーカイブ
目次
  1. Top
  2. 情報技術
  3. Web
  4. 有効な証明書なのにcertificate has expiredになる件
目次