★追記:2016-04-30

さくらのレンタルサーバの「標準のPHP」が5.6になってたので、改めて確認したところ、SSLエラーは解消されていました。

さくらのレンタルサーバ・さくらのマネージドサーバにて標準のPHP[PHP5] のバージョンを変更します
http://support.sakura.ad.jp/mainte/functionaddentry.php?id=17892

−−−−−−−−−− 以下、解消前の記事 −−−−−−−−−−

スクリーンショット 2015-09-02 10.02.18

しばらく前から、さくらのレンタルサーバでPHP5.6が選べるようになって大変嬉しいのですが、PHP5.6からSSLの扱いが変更になったことと、サーバの証明書の関係で、readfilefile_get_contents などでHTTPSなURLを参照すると、下記のようなエラーになることがあります。

Warning: readfile(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /foo/var/ssl_test.php on line 1

Warning: readfile(): Failed to enable crypto in /home/foo/bar/ssl_test.php on line 1

Warning: readfile(https://tbx.sakura.ne.jp/test.txt): failed to open stream: operation failed in /home/foo/bar/ssl_test.php on line 1

PHP5.6に設定した後から、他所のファイル読込みやPOSTが一部できなくなって、調べてみたら上記のようなエラーがありました。

root権限のないサーバではやれることに制限があるものの、HTTPSなファイルの読込みを維持したいので、ひとまずは以下のいずれかの方法で解決します。
サポートへリクエストを送ったので、いずれ解消されると思います。

  1. ピア証明書の検証を行わない。 任意の証明書を読ませるオプションを追記する

    php – file_get_contents(): SSL operation failed with code 1. And more – Stack Overflow

    (追記)
    この次の方法でエラーが解消されない場合は、ソースコードをいじることになりますがこの方法が適しています。
    検証を迂回するのはさすがにまずいですね…

  2. php.ini に新しい証明書を認識させる

    ComposerからLaravelを導入しようとしてOpenSSL周りのエラーで困った件 – Qiita

    さくらはphp.iniを編集できるので、新しい証明書を認識させてやります。

    新しい証明書を cacert.crt などにリネームし、適当なところへ配置して下記のようにフルパスを記述します。

    curl.cainfo=/home/foo/bar/cacert.crt
    openssl.cafile=/home/foo/bar/cacert.crt