PHPのcurl_execの結果がfalseになる




数年前に作ったサイトを久しぶりに触ったところ、今まで出ていなかったエラーが出ていました。
何も変わっていないはずだったので原因がわからずいろいろ調べていたところ、cURL通信でエラーが出ていることがわかりました。
今回はその内容についてまとめます。

今回の現象

数年前に作ったサイトをひさしぶりにさわったら、API通信で利用しているcURLでエラーが発生するようになった。

原因

原因はcURLバージョンが7.10以上になっていることだと推測しています。
過去のcURLのバージョンを確認できないのではっきりわかりませんが、現状は7.54.1となっており、PHPのマニュアルを見るとcURL7.10以降SSL周りのデフォルト値が変更されていたのでこのバージョンアップが原因と考えています。

調査内容

エラーの確認方法としては、curl_errorno(),curl_error()関数を使ってエラーの内容を表示したところ、以下のエラーが確認できました。

エラーコード:60
エラーメッセージ:SSL certificate problem: certificate has expired

cURL関連を調べたところ、PHPマニュアルのcurl_setopt関数で以下の内容が記載されていました。

CURLOPT_SSL_VERIFYPEER・・・・cURL 7.10 以降、デフォルト値は true です。また、 cURL 7.10 以降、デフォルトでインストールされています。

PHP公式マニュアル

以前は動いていて何もしていないのSSL周りのエラーが出ているのでこちらを疑いました。
早速cURLのバージョンを確認したところ7.54.1でした。
あとはCURLOPT_SSL_VERIFYPEERをfalseにして動作か確認するだけです。

curl_setopt(コネクション変数, CURLOPT_SSL_VERIFYPEER, false);

を設定したところ、無事以前と同じように動作するようになりました。
ということなのでcURLのバージョンの影響ということで間違いなさそうです。

CURLOPT_SSL_VERIFYPEERをfalseにするとオレオレ証明書などが有効にはなってしまいますが、レンタルサーバーを利用している場合はPHPの設定を操作することが難しいのでこれで良しとします。

解決方法まとめ

PHPのcURLで「エラーコード:60、エラーメッセージ:SSL certificate problem: certificate has expired」がでた場合、curl_setoptでCURLOPT_SSL_VERIFYPEERをfalseに設定することで解決できる場合があります。
この設定はcURLバージョンが7.10以降だとデフォルトtrueになっているため、エラーが出る場合、運用上問題がなければfalseにして回避することができます。