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 回答