允许 HTTPS 包装器的自签名证书

Posted

技术标签:

【中文标题】允许 HTTPS 包装器的自签名证书【英文标题】:Allow self-signed certificates for HTTPS wrapper 【发布时间】:2012-12-26 02:09:52 【问题描述】:

基本上我有这个:

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,

它should 现在接受任何服务器证书,甚至是我的自签名证书。但它仍然是相同的行为 - [A] 有效,[B] 无效。为什么?


顺便说一句:我知道它适用于 curl 扩展,但我想在没有它的情况下击败它。

【问题讨论】:

请定义 "使用 [A] 可以正常工作" ...因为这些都不应该工作。您尚未指定 "cafile""capath" 来告诉 php 使用什么 CA 证书进行对等验证,并且您已禁止自签名证书。如果您确实使用此处显示的确切代码,则 [A] 和 [B] 都无法成功连接。 【参考方案1】:
$contextOptions = array(
    'ssl' => array(
        'verify_peer'       => true,
        'allow_self_signed'=> true
    )
);
$sslContext = stream_context_create($contextOptions);

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

上面的工作正常

【讨论】:

如果您使用 SSL MITM 代理,我认为 verify_peer 应该设置为 false【参考方案2】:

这对我有用。祝你好运。

$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);

【讨论】:

如果您根本没有 SSL,这显然也有效!我在没有任何 SSL 设置的 MAMP 服务器上尝试了它,它工作正常。如果您只需要在开发服务器上运行,那就太好了 :) 我必须添加选项 'verify_peer_name' => false 才能让自签名证书工作

以上是关于允许 HTTPS 包装器的自签名证书的主要内容,如果未能解决你的问题,请参考以下文章

信任来自 IIS 的自签名证书

验证设备的自签名证书

SSL证书问题:证书链中的自签名证书

Ubuntu apache创建有效的自签名证书ssl https(删除连接不安全)[重复]

Intranet 中的自签名 TLS 证书

Curl 错误 60,SSL 证书问题:证书链中的自签名证书