允许 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 包装器的自签名证书的主要内容,如果未能解决你的问题,请参考以下文章