11

基本的に私はこれを持っています:

function request($url) {
    return file_get_contents($url, false, stream_context_create(array(
        "ssl" => array(
            "verify_peer" => true,
            "allow_self_signed" => false,
        )
    )));
}

request("https://[A]");
request("https://[B]");

[A] は「実際の」証明書を持つサーバー上の URL であり、[B] は自己署名証明書のみを持つサーバー上の URL です。

[A] では正常に動作し、[B] では次のようになります。

file_get_contents(): Failed to enable crypto

これは、「サーバー証明書の検証に失敗しました」のようなものであるはずのかなり残念なエラーメッセージですが、問題ありません...

今、私は考えました:「わかりました、[B]は私のテストシステムです-証明書は気にしません」そしてコンテキストを次のように変更しました:

"verify_peer" => false,
"allow_self_signed" => true,

これで、自己署名したものであっても、サーバー証明書を受け入れるはずです。しかし、それは同じ動作です - [A] は機能しますが、[B] は機能しません。なんで?


ところで:curl拡張機能でうまく機能することは知っていますが、それなしでこれを打ち負かしたいです。

4

2 に答える 2

16

これは私にとってはうまくいきます。幸運を。

$context = [ 'http' => [ 'method' => 'GET' ], 'ssl' => [ 'verify_peer' => false, 'allow_self_signed'=> true ] ];
$context = stream_context_create($context);
$resp = file_get_contents('https://site/', false, $context);
于 2015-01-06T19:54:58.607 に答える
2
$contextOptions = array(
    'ssl' => array(
        'verify_peer'       => true,
        'allow_self_signed'=> true
    )
);
$sslContext = stream_context_create($contextOptions);

file_get_contents("https://...., false, $sslContext);

上記は正常に動作します

于 2014-12-02T02:00:38.590 に答える