2011-12-07 3 views
3

내 웹 사이트에서 일부 HTTPS URL을 읽으려고하면 문제가 발생합니다.PHP 메소드로 HTTPS 링크 사용 (file_get_contents, getimagesize)

"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에서

((디스플레이는 "OK"표시해야합니다)) 내가 가진 :

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

아이디어가있는 경우.

도움 주셔서 감사합니다.

(시 : 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

당신이 file_get_contents HTTP를 통해 작동하는지 확인입니까? fopen/curl에 대한 두 개의 개별 아이디어가 있지만 file_get_contents가 두 경우 모두 실패하는 경우에만 true입니다. :) 또한 다른 https URL로 시도 했습니까? – mishu

+0

파일 내용을 다운로드하는 데 사용하는 줄을 넣을 수 있습니다. – ThoriumBR

+0

다른 포럼에서 읽은 내용에 따르면, 예 file_get_contents가 작동해야합니다. 그러나 이러한 경우 (https), 나는 컬이 더 적절하다고 읽었다. 그럼에도 불구하고 Google https 링크를 읽으려고했는데 두 방법 모두에서 작동합니다. – F2000

답변

4

받은 오류 (SSL23_GET_SERVER_HELLO : 알 수없는 프로토콜)로 판단하면 거의 확실합니다. 서버가 클라이언트보다 새로운 버전의 SSL을 가지고 있습니다. 당신은 2006 년부터 지난 5 년 만에 list of vulnerabilities in OpenSSL를 살펴 보자되는 SSL의 0.9.8c

버전을 사용하는 동안

서버는 아마로, 버전> = 1.0.0을 사용하고 있습니다 업그레이드 할 이유.

다른 많은 사람들은 reported similar experiences 입니다. 또한 herehere입니다.

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

관련 문제