2013-02-25 12 views
11

httpsホストのfile_get_contentsは、特定のホスト(一部の会社のテストAPIサーバー - ホワイトリストに登録されているIP、テストするURLを指定することはできません)を除いて、正常に動作します。これは、ロードされたhttpsモジュールやその他の初期設定の間違いを排除します。file_get_contentsはverify_peer => falseを無視していますか?

私は複数のPHPインストールで、すべてv5.3.3,32ビット、Debian 32ビットでテストしました。

要求はcURLで動作しますが、設定する場合はcurl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);です。ただし、file_get_contentsのコンテキストにverify_peer"=>falseを設定しても差はありません。 file_get_contentsで

、まったく同じリクエスト(同じURL、同じXMLのPOSTデータ)SSLで失敗します。

$arrContextOptions=array(
    "http" => array(
     "method" => "POST", 
     "header" => 
      "Content-Type: application/xml; charset=utf-8;\r\n". 
      "Connection: close\r\n", 
     "ignore_errors" => true, 
     "timeout" => (float)30.0, 
     "content" => $strRequestXML, 
    ), 
    "ssl"=>array(
     "allow_self_signed"=>true, 
     "verify_peer"=>false, 
    ), 
); 

file_get_contents("https://somedomain:2000/abc/", false, stream_context_create($arrContextOptions)); 

:ピアによって接続がリセットされました。

誰かがfile_get_contentsでこれを見つけましたか? どのようにデバッグするのですか?

+0

をインストールするには、falseに 'allow_self_signed'を設定してみてくださいましたか? – Repox

+0

同じエラーが発生しました。 –

+4

なぜcURLを使用しないのですか? –

答えて

0

は、このコードを試してください:あなたがエラーを取得しない場合

$fp = fsockopen("ssl://somedomain/abc/", 2000 , $ErrNo, $ErrString, 30); 
if (!$fp) { 
    echo "Error No : $ErrNo - $ErrString <br />\n"; 
} else { 
    $out = "POST/HTTP/1.1\r\n"; 
    $out .= "Host: somedomain \r\n"; 
    $out .= "Content-Type: application/xml; charset=utf-8;\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
     echo fgets($fp, 128); 
    } 
    fclose($fp); 
} 

、私は(のfile_get_contents付き)問題は、そうでない場合は、サーバー構成からフォームのクライアントPHPの設定だと思います。

+0

OK、fsockopenが機能しました。しかし、PHPの設定には何も問題はありません。他の多くのHTTPS自己署名SSL証明書でうまく動作します。 –

0

これをデバッグしようとすると、Wiresharkと表示される可能性があります。何が問題になるかを知るためには、SSLエラーが発生しているはずです。

+0

SSLサーバーはハングアップする前にSSLエラーを報告しますか? –

+0

「ピアによって接続がリセットされました」というメッセージが表示されます。これは、必然的にハングアップしないことを意味します。私は、クライアントとサーバがどちらのSSLハンドシェイクバージョンを使用するのに同意できないかを推測しています。このエラーが発生します。 – JackTheRandom

1

これが実際に役立つかどうかわかりませんが、オプションの配列からSSLオプションを削除してみてください。

によるhttp://www.php.net/manual/en/context.ssl.phpverify_peerのデフォルトはfalseです。

allow_self_signed必須verify_peer、デフォルトではfalseです。

上記から、allow_self_signedは、おそらくverify_peerの設定よりも優先されます。

SSL、またはallow_self_signedがない場合はお試しください。それが役に立った場合は、お知らせください。

-1

これだけ

yum install ca-certificates.noarch 
+1

このコードスニペットは問題を解決するかもしれませんが、[説明を含む](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えていて、コード提案の理由を知らない人もいるかもしれません。また、コードと説明の両方の可読性が低下するため、説明的なコメントを使用してコードを混乱させないようにしてください。 – FrankerZ

関連する問題