当我尝试在我的网站上阅读一些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);
答案 0 :(得分:4)
从您收到的错误(SSL23_GET_SERVER_HELLO:未知协议)判断,这几乎可以肯定是由于服务器拥有比您客户端更新版本的SSL。
当您使用0.9.8c
时,服务器可能正在使用版本> = 1.0.0您的SSL版本来自2006年。请查看过去5年中的list of vulnerabilities in OpenSSL,作为升级的原因。
很多其他人reported similar experiences 。还有here和here。
答案 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时发挥作用。