curlなどで発生するPHP 「SSL certificate problem」の対処法

by sixl

現象

httpsのURLに対してcurlコマンドやfile_get_contentsなどを実行するときに、以下のようなエラーが発生します。

PHP Warning:  file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error: 14090086 :SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in fuga.php on line xxxx
PHP Warning:  file_get_contents(): Failed to enable crypto in fuga.php on line xxxx
PHP Warning:  file_get_contents(): failed to open stream: operation failed in fuga.php on line xxxx

原因

httpsのURLに対してCA証明書を確認しようとしますが、証明書情報が無いために発生します。また、PHP 5.6からSSL認証を厳密に行うため発生する問題です。PHP 5.4 以前だと発生しません。

対処法

1.最新の証明書をダウンロードして、一つのテキストにして格納します。

Mozilla CA証明書はこちら→https://curl.haxx.se/ca/cacert.pem

Googleの証明書はこちら→https://pki.google.com/roots.pem

Mozillaの証明書でだいたいカバーできますが(github, etc.)、googleのhttpsを利用する人はそちらの証明書も必要です。

2.php.iniに以下を追記して、証明書を読み込ませます。

curl.cainfo=/local/hoge/cacert.crt
openssl.cafile=/local/hoge/cacert.crt

3.apacheを再起動して完了です。