2018年7月4日に解消されました
はじめに
KUSANAGIを使っています。
一ヶ月ほど前(2018年5月)ごろからKUSANAGIをアップデートすると一部でエラーがでてしまうようになりました。
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 /mnt/example.com/test.php on line 4
Warning: file_get_contents(): Failed to enable crypto in /mnt/example.com/test.php on line 4
Warning: file_get_contents(https://example.com/test.jpg): failed to open stream: operation failed in /mnt/example/test.php on line 4
PHPで外部へ接続に行く際にエラーになってしまうようです。
解決方法
/etc/php7.d/php.ini
にopenssl.cafile=/etc/ssl/certs/ca-bundle.crt
を追記すれば問題が回避できました。
(中略)
; be overridden on a per-stream basis via the "cafile" SSL stream context
; option.
openssl.cafile=/etc/ssl/certs/ca-bundle.crt
; If openssl.cafile is not specified or if the CA file is not found, the
; directory pointed to by openssl.capath is searched for a suitable
(中略)
問題の確認など
phpinfo
を設置して、環境変数openssl.cafile
が設定されているのか、居ないのかを確認します。
<?php phpinfo();
アップデート後はopenssl.cafile
の値が空欄になっていました。
上記の解決策を入れると/etc/ssl/certs/ca-bundle.crt
が設定されています。
自分の場合はPHP7-FPMを使っていたので/etc/php7.d/php.ini
が設定ファイルでした。
環境変数を読み出す対象となるファイルは確認が必要です。
特にKUSANAGIの場合にはいろんなphp.ini系のファイルがあるので注意が必要でした。
解決できなかったけどヒントになった情報
エラーメッセージでググると情報がたくさん出てきます。
$url = "https://xxxxxx";
$options['ssl']['verify_peer']=false;
$options['ssl']['verify_peer_name']=false;
$response = file_get_contents($url, false, stream_context_create($options));
開発環境で自己署名しているhttps環境において、file_get_contentsすると、
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 xxxxx
というエラーが表示されます。
証明書入れてくれよと思うのですが、導入できない時もあります。その場合は、optionを付与することで回避できます。
なのですが、cURLやfile_get_contents()
の情報がでてくるのですが、PHPの根本から解決する情報がありませんでした。
GuzzleなどのcURLをラッピングしてしまうライブラリの場合、中のオプション設定が結構大変そうだったため、解決策を探していました。
うまく解決出来てよかったです。