ロゴマーク 2021/10/02 PHP

【PHP】file_get_contentsでエラー

ライターhiro
最近Youtubeもやってます。チャンネル登録よろしく!

ずっと稼働してたサーバーでいつからかfile_get_contents()でエラーが起きており自サーバー内のファイルを読みにいけなくなるという現象が起きていました。

出てたエラーは下記のようなものでした。

file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in

file_get_contents(): Failed to enable crypto

file_get_contents failed to open stream: operation failed

file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in

どうやらSSLの証明書がいけないらしい

と言ってもレンタルサーバーでSSLの証明書をこちらでどうこうという事が難しいので

PHP側でなんとかするしかないという結論に至りました。

今までのソースは

$data = file_get_contents ( $url );

こういう感じでデータを取得していた部分を少し書き換えます。

$cnt['ssl']['verify_peer'] = false;

$cnt['ssl']['verify_peer_name'] = false;

$data = file_get_contents ( $url , false , stream_context_create ( $ cnt ) );

と変更します。

verify_peer はSSL サーバー証明書の検証を要求するかどうかでデフォルトの値は true です。

verify_peer_nameはピア名の検証を要求するかどうかでデフォルトの値は true です。

この2つの部分を変更したものを第3引数に stream_context_create ()関数を使って渡してあげます。

これをしてあげたら無事にエラーを起こさずファイルの内容を取得できるようになりました。

ただ、PHPの公式のドキュメント

「一般的にはおすすめできませんが、 コンテキストオプション verify_peer を false にしてリクエストでの

ピア証明書の検証を無効化することもできます。

また同じく、ピア名の検証も、コンテキストオプション verify_peer_name を false にすれば無効化できます。」

と記述があったので、これをする方は何か問題が起こっても自己責任でお願いします。

一番いいのはSSLの方をいじってエラーが出ない状態にするのが一番いいかと思うのですが、今回のは苦肉の策というか、とりあえず急ぎで file_get_contents() の関数が動く状態にしたい時に使う応急処置的なものになるかと思います。

以下のサイトにもっと細かい説明が出ているので理解を深めたい方は参考にしてみてください。

PHP 5.6.x における OpenSSL 関連の変更

SSL コンテキストオプション

file_get_contents

型宣言ー厳密な型付け

最近Youtubeもやってます。チャンネル登録よろしく!

トップへ戻る Page
top
Top