简体   繁体   中英

Using HTTPS link with php methods (file_get_contents, getimagesize)

I get a problem when I try to read some HTTPS url in my website.

If I use "http", there is no problem (with file_get_contents and curl), but when I remplace "http" by "https", these methods don't work.

I get some errors:

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

In my browser, all methods work: https://ssl10.ovh.net/~fyprbqhq/_perso/facebook.myclimb/test.php (Display should show "OK")

In phpinfo() I got:

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

If you have any ideas.

Thanks for help.

(Ps: get_headers() don't work too with https in my case)

More info:

file_get_contents:

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

Curl:

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

Judging from the error you received (SSL23_GET_SERVER_HELLO:unknown protocol) this is almost certainly caused by the server having a newer version of SSL than your client.

The server is probably using a version >= 1.0.0, while you are using 0.9.8c

Your version of SSL is from 2006. Take a look at the list of vulnerabilities in OpenSSL in the last 5 years, as a reason for you to upgrade.

Lots of other people have reported similar experiences . Also here and here .

If you're using PHP 5.6.x, there's been some changes that effect SSL/TLS negotiation.

In PHP 5.6, all stream wrappers now verify peer certificates and host names by default when using SSL/TLS.

To work around hosts the have don't have validate ssl / tls sockets, try using this.

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

This of course isn't recommended as you are forfeiting the verification of your host.

For me, this came into play while access the flickr api -- api.flickr.com.

Reference: http://php.net/manual/en/migration56.openssl.php

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM