私は、サーバー上に作成した 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:...php の 2 行目で証明書の検証に失敗しました
- 警告: file_get_contents(): ...php の 2 行目で暗号化を有効にできませんでした
- 警告: 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
): ストリームを開けませんでした: ...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 = オン
彼は、私たちは Gentoo を使用しているので、ビルド時に openssl がコンパイルされ、php.ini ファイルでは設定されていないと教えてくれました。
それが機能していることも確認しましたallow_url_fopen
。この問題は特殊な性質のものなので、助けになる情報があまり見つかりません。このような状況に遭遇した方はいらっしゃいますか? よろしくお願いします。
ベストアンサー1
これは見つけるのに非常に役立つリンクでした:
http://php.net/manual/en/migration56.openssl.php
PHP 5.6 で open ssl に加えられた変更を説明する公式ドキュメント。ここから、false に設定する必要があるもう 1 つのパラメータを知りました: "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; ?>