file_get_contents()をHTTPSで動作させるには?


106

クレジットカード処理の設定に取り組んでおり、CURLの回避策を使用する必要がありました。次のコードは、テストサーバー(SSL URLを呼び出さない)を使用していた場合は正常に機能しましたが、現在HTTPSを使用して稼働サーバーでテストすると、「ストリームを開けませんでした」というエラーメッセージが表示されて失敗します。

function send($packet, $url) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>$packet
      )
    )
  );
  return file_get_contents($url, 0, $ctx);
}

回答:


89

次のスクリプトを試して、phpスクリプトで使用できるhttpsラッパーがあるかどうかを確認します。

$w = stream_get_wrappers();
echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_export($w);

出力は次のようになります

openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
  [...]
}

私は、allow_url_fopenをを求めた理由です@volker
ゴードン・

奇妙なのは、opensslがオフになっているということですが、phpinfo()によると、私が間違っていると思わない限り、それがコンパイルされています。
James Simpson、

phpinfo()はconfigure行でそのように指示しますか、それとも「OpenSSL」と呼ばれるセクション全体がありますか?
VolkerK 2009

さて、それはそれのためのセクションではなく、設定行にあります。それが問題だと思いますか?
James Simpson、

私はそれをすべて持っていますが、それでも機能しません。そして、allow_url_fopen。https以外のURLのみがlocalhostから機能します。
カーティス、

116

httpsラッパーを許可するには:

  • php_openssl拡張子が存在している必要がありますし、有効にします
  • allow_url_fopen に設定する必要があります on

php.iniファイルに存在しない場合は、次の行を追加する必要があります。

extension=php_openssl.dll

allow_url_fopen = On

私のインストールでは両方ともオンに設定されていますが、SSLエラー「警告:file_get_contents():SSL:ハンドシェイクがタイムアウトしました」
Adamantus

53

以下を試してください。

function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

注:これにより、SSL検証が無効になります。つまり、HTTPSによって提供されるセキュリティが失われます。このコードは、テストやローカル開発にのみ使用し、インターネットやその他の公衆ネットワークでは使用しないでください。このコードが機能する場合、SSL証明書が信頼されていないか、検証できないことを意味します。別の問題として修正を検討する必要があります。


29
クレジットカードの処理を行う際に、ssl検証を無効にするのはなぜですか?
ピーター

ありがとう、トリックはここにあります:curl_setopt($ ch、CURLOPT_SSL_VERIFYPEER、FALSE);
ディランB

46
$url= 'https://example.com';

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

$response = file_get_contents($url, false, stream_context_create($arrContextOptions));

これにより、HTTPSであるかどうかにかかわらず、URLからコンテンツを取得できます。


ありがとう!これでうまくいきました。FB Open Graph APIを呼び出そうとしました:)
decodepanda

私はテストの目的で無効な証明書で私のドメインにアクセスしようとしていましたが、これがSSL検証を無効にしても、それが必要でした。
カーラ2017年

すごい!私は5日間、file_get_contentsを使用してXAMPPテストサイトにairbnbカレンダーをダウンロードしようとしましたが、これで問題は解決しました。ありがとうございます。
JohnnyBeGood

https経由で有効なHTTP証明書を使用せずにVagrantテストボックスに接続しようとして働いた。ここで設定されているPHP SSLコンテキストオプションへのリンク:php.net/manual/en/context.ssl.php ; ピアの確認=使用するSSL証明書の確認が必要。verify_peer_name =ピア名の検証が必要です。
アンソニー

これはSSL証明書に違反しているのではなく、セキュリティホールですか?
webchun

10

これはおそらく、ターゲットサーバーに有効なSSL証明書がないためです。


要求サーバーはSSL証明書を持っている必要はありません。
ceejayoz、2009

15
要求元のサーバーについては言っておらず、ターゲットサーバーについても述べています。
EmilVikström、

2
それは私にスキムを教えるでしょう。へえ!私の謝罪を受け入れ、賛成票を投じてください。
ceejayoz、2009

ターゲットサーバーには有効なSSL証明書があります。
James Simpson、

@James、代わりにcURLで接続しようとするとエラーが発生しますか?それとも、それを試すことは絶対に不可能ですか?
EmilVikström、

6

php.iniファイルに2行追加するだけです。

extension=php_openssl.dll

allow_url_include = On

それは私のために働いています。


1
allow_url_fopen質問はURLの開始に関するものなので、含めないでください。
shukshin.ivan 2014


5

OpenSSLのサポートを組み込んでいる場合、HTTPSはPHP 4.3.0以降でサポートされています。また、ターゲットサーバーに有効な証明書があり、ファイアウォールが発信接続を許可しallow_url_fopen、php.iniでtrueに設定されていることを確認してください。


OpenSSLをサポートするPHP 5.2.8を使用しています。これで同じエラーが発生し、ターゲットサーバーには有効な証明書があります。
James Simpson、

2
ファイアウォールはアウトバウンドhttps接続を許可するように構成されていますか?通常、httpsを実行しているウェブサーバーはポート80で実行されません。「ストリームを開くことができませんでした」以外のエラーは他にありますか?
ゴードン、

1
私が知る限り、これはエラー全体です:警告:fopen(https:// ...)[function.fopen]:ストリームを開けませんでした:/ home / user / public_html /にそのようなファイルまたはディレクトリはありません993行目のtest.php
James Simpson、

そしてphp.iniのallow_url_fopenは何に設定されていますか?
ゴードン

それは変です。HTTPおよびHTTPSのURLでGETを実行して、それが機能するかどうかを確認できますか?ストリームコンテキストなし?
ゴードン

3

私の場合、問題はWAMPがCLIに対してApacheとは異なるphp.iniを使用していたため、WAMPメニューから行った設定はCLIに適用されません。CLI php.iniを変更するだけで機能します。


1

サーバーは、HTTPリクエストヘッダーに表示される、または表示されないもの(適切なユーザーエージェントなど)に基づいて、応答しないことを選択する場合があります。ブラウザに接続できる場合は、ブラウザが送信するヘッダーを取得して、ストリームコンテキストでそれらを模倣します。


0

IISでhttpsが機能しないことに悩まされました。で解決:

file_get_contents( 'https ..)はロードされません。

  • https://curl.haxx.se/docs/caextract.htmlをダウンロード
  • ..phpN.N / extras / sslにインストール
  • php.iniを次のように編集します。

    curl.cainfo = "C:\ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem" openssl.cafile = "C:\ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem"

最後に!


-1

URLがアップしているかどうかを確認するには

あなたの質問のコードは、作業バージョンについて書き直すことができます:

function send($packet=NULL, $url) {
// Do whatever you wanted to do with $packet
// The below two lines of code will let you know if https url is up or not
$command = 'curl -k '.$url;
return exec($command, $output, $retValue);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.