使用带有php方法的HTTPS链接(file_get_contents,getimagesize)

时间:2011-12-07 11:33:32

标签: php https

当我尝试在我的网站上阅读一些HTTPS网址时出现问题。

如果我使用“http”,则没有问题(使用file_get_contents和curl),但是当我用“https”重新设置“http”时,这些方法不起作用。

我收到了一些错误:

failed to open stream: operation failed occured

Failed to enable crypto occured

SSL operation failed with code 1. OpenSSL Error messages: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

在我的浏览器中,所有方法都有效: https://ssl10.ovh.net/~fyprbqhq/_perso/facebook.myclimb/test.php(显示应显示“确定”)

在phpinfo()中我得到了:

openssl
OpenSSL support enabled
OpenSSL Version OpenSSL 0.9.8c 05 Sep 2006

如果您有任何想法。

感谢您的帮助。

(Ps:get_headers()在我的情况下也不适用于https)

更多信息:

的file_get_contents:

$data = file_get_contents("https://ssl10.ovh.net/~fyprbqhq/_perso/facebook.myclimb/test.php");

卷曲:

$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, "http://ssl10.ovh.net/~fyprbqhq/_perso/facebook.myclimb/test.php");
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT,2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);
$data = curl_exec($curl_handle);
curl_close($curl_handle);

2 个答案:

答案 0 :(得分:4)

从您收到的错误(SSL23_GET_SERVER_HELLO:未知协议)判断,这几乎可以肯定是由于服务器拥有比您客户端更新版本的SSL。

当您使用0.9.8c

时,服务器可能正在使用版本> = 1.0.0

您的SSL版本来自2006年。请查看过去5年中的list of vulnerabilities in OpenSSL,作为升级的原因。

很多其他人reported similar experiences 。还有herehere

答案 1 :(得分:0)

如果您使用的是PHP 5.6.x,那么会有一些影响SSL / TLS协商的更改。

  

在PHP 5.6中,所有流包装器现在默认使用SSL / TLS时验证对等证书和主机名。

要解决主机问题,我们没有验证ssl / tls套接字,请尝试使用此功能。

$ctx = stream_context_create(['ssl' => [
    'capture_session_meta' => TRUE,
    'verify_peer' => false,
    'verify_peer_name' => false
]]);

$html = file_get_contents('https://google.com/', FALSE, $ctx);
$meta = stream_context_get_options($ctx)['ssl']['session_meta'];
var_dump($meta);

这当然不建议您丢失主机验证。

对我来说,这是在访问flickr api - api.flickr.com时发挥作用。

参考:http://php.net/manual/en/migration56.openssl.php