1. ホーム
  2. php

[解決済み】file_get_contents(): SSL 操作にコード 1 で失敗した、暗号を有効にするのに失敗した

2022-04-03 12:30:35

質問

私たちのサーバーに作成したPHPページから、この特定のRESTサービスにアクセスしようとしています。 問題は、この2行に絞られました。 つまり、私のPHPページは次のようになります。

<?php
$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json");

echo $response; ?>

2行目で次のようなエラーが出てページが終了します。

  • 警告:file_get_contents()。SSL 操作はコード 1 で失敗しました。 OpenSSL エラーメッセージ: error:14090086:SSL ルーチン:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in ...phpの2行目
    • 警告:file_get_contents(): 暗号を有効にするのに失敗しました。 2行目
    • 警告 ファイル_get_contents( https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json ): ストリームを開くのに失敗しました: ...php の 2 行目で操作が失敗しました。

Gentooのサーバーを使用しています。 最近、PHPのバージョンを5.6にアップグレードしました。 この問題が発生したのは、アップグレード後でした。

のようなアドレスでRESTサービスを置き換えてみるとわかりました。 https://www.google.com 私のページは正常に動作しています。

以前の試行で、私は “verify_peer”=>false で、これを file_get_contents の引数として渡すと、ここに書かれているようになります。 file_get_contents ignoring verify_peer=>false? しかし、作者が指摘したように、それは何の違いもなかった。

サーバー管理者の一人に、php.iniファイルにこれらの行が存在するかどうか尋ねてみました。

  • 拡張子=php_openssl.dll
  • allow_url_fopen = On

Gentooなので、ビルド時にopensslがコンパイルされ、php.iniファイルには設定されていないとのことでした。

また、確認したところ allow_url_fopen は動作しています。 この問題の特殊性から、ヘルプのための情報があまり見つかりません。 どなたかこのようなことに遭遇した方はいらっしゃいますか? ありがとうございます。

解決方法は?

このリンクは非常に役に立ちました。

http://php.net/manual/en/migration56.openssl.php

PHP 5.6 の open ssl に関する変更点を説明した公式ドキュメントです。 ここから、もう一つfalseに設定すべきパラメータがあることを知りました: "verify_peer_name"=>false

<ブロッククオート

注意 これには 非常に セキュリティ上、重要な意味を持ちます。検証を無効にすることで、潜在的に MITM攻撃者 は、無効な証明書を使用してリクエストを盗聴することができます。ローカルな開発でこれを行うことは有用かもしれませんが、実運用では他の方法を使うべきです。

というわけで、私の作業コードはこんな感じです。

<?php
$arrContextOptions=array(
    "ssl"=>array(
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ),
);  

$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json", false, stream_context_create($arrContextOptions));

echo $response; ?>