WordPressで「cURL error 60」が出続けた原因
― WordPress内部のCA証明書だった話 ―
発生した問題
ある日突然、WordPress管理画面から
-
プラグインの更新ができない
-
テーマの更新ができない
という状態になった。
表示されるエラーは以下。
ブラウザでサイト表示はできる。
記事の更新や編集もできる。
それでも、WordPressだけが外部通信できない。

最初に疑ったこと(一般的な切り分け)
まずは、さくらサーバーのサポートにメール連絡した。
メールで確認したのは、次の2点。
-
本サーバーのPHP(cURL)が参照しているCA証明書
-
SSL証明書チェーンが正しく設定されているか
この2点を確認した結果、
いずれも問題なし。
続けて、次のような内容だった。
WordPressは、内部で独自にCA証明書を管理しております。
その為、こちらの内容はWordPressの問題となり、
お客様コンテンツ上にて発生している問題となってしまい、
弊社のサポート対象外となりますため、
お客様にてお調べいただきご対応いただく必要がございます。
WordPressは「独自のCA証明書バンドル」を持っている
このメールの内容で、
WordPressは内部で独自にCA証明書バンドルを持っている
ということが理解できた
(正直、この時点でやっと理解できた)。
WordPressは、
この 内部CAバンドル を使って
SSL検証を行う。
つまり、
-
OSのCA証明書
-
PHP / curl の設定
が正常でも、
👉 WordPress内部のCAが古ければ失敗する
という構造になっている。
決定的証拠
実際に ca-bundle.crt の中身を確認すると、
明らかに問題のある証明書が含まれていた。
-
GTE CyberTrust Global Root
-
有効期限:2018年
-
署名アルゴリズム:md5RSA
現在では、
OS側では多くの環境で
Disallowed(信頼拒否)扱いとなっている証明書らしい。
この時点で、
cURL error 60 が出ていた原因はほぼ確定した。
解決方法
WordPress内部のCA証明書バンドルを更新する
やったことはシンプルだった。
1. 既存ファイルをバックアップ
2. 最新のCAバンドルを取得
WordPress公式GitHubから取得。
3. 新しい ca-bundle.crt を配置
に、そのままアップロード。
4. 確認
管理画面からプラグイン更新を実行 → 成功
cURL error 60 は完全に消えた。
なぜ「可能性は低い」と言われがちなのか
正直に言うと、この原因はレアケース。
僕がwordpressの更新を何年もしていなかった。(←本当の原因はこれ汗)
多くの場合は、
-
OSのCA証明書更新
-
PHP / curl の調整
で解決する。
しかし今回のように、
-
WordPress本体が非常に古い
-
長期間アップデートされていない
-
OS側は更新されている
という条件が揃うと、
👉 WordPress内部のCAだけが取り残される
という状態が起きる。
同じ症状の人へ(もし、いるならば・・・)
以下がすべて当てはまったら、
WordPress内部のCA証明書バンドルを疑う価値がある。
-
WordPressが古い(5.x以前など)
-
プラグイン更新に失敗して、↓↓
-
cURL error 60が出る -
OS / PHP / curl は正常
まとめ
-
WordPressは内部にCA証明書バンドルを持っている。
-
OSやPHPが正常でも、内部CAが古いとSSLエラーになる。
-
wp-includes/certificates/ca-bundle.crtの更新で解決する場合がある。
今回の原因は、ただ自分の更新の怠りだった。(言い訳すると、更新の大切さを知らなかった)
おわりに
「可能性は低い」と言われる原因ほど、
実際にハマると抜けにくい。
今回のように、
実体を確認し、1つずつ潰していくことの大切さを改めて感じた。
同じエラーで時間を溶かしている人の助けになれば幸いです。