HTTPS에서 작동하도록 file_get_contents ()를 얻는 방법은 무엇입니까?


106

저는 신용 카드 처리 설정을 작업 중이며 CURL에 대한 해결 방법을 사용해야했습니다. 다음 코드는 테스트 서버 (SSL URL을 호출하지 않음)를 사용할 때 제대로 작동했지만 이제 HTTPS를 사용하여 작동중인 서버에서 테스트 할 때 "스트림을 열지 못했습니다"라는 오류 메시지와 함께 실패합니다.

function send($packet, $url) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>$packet
      )
    )
  );
  return file_get_contents($url, 0, $ctx);
}

답변:


89

다음 스크립트를 사용하여 php 스크립트에 사용할 수있는 https 래퍼가 있는지 확인하십시오.

$w = stream_get_wrappers();
echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
echo 'wrappers: ', var_export($w);

출력은 다음과 같아야합니다.

openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
  [...]
}

@volker 그래서 내가 allow_url_fopen을 요청한 이유입니다
Gordon

이상한 점은 openssl이 꺼져 있다고 말하지만 phpinfo ()에 따르면 잘못 보지 않는 한 컴파일됩니다.
James Simpson

phpinfo ()는 설정 라인에서 그렇게 알려줍니다. 아니면 "OpenSSL"이라는 전체 섹션이 있습니까?
VolkerK

좋습니다. 섹션이 아니라 구성 라인에 있습니다. 그게 문제인 것 같아요?
James Simpson

나는 모든 것을 가지고 있으며 여전히 작동하지 않습니다. 그리고 allow_url_fopen. 비 https URL 만 localhost에서 작동합니다.
Curtis

116

https 래퍼를 허용하려면 :

  • php_openssl확장은 존재해야하며 사용 가능
  • allow_url_fopen 로 설정되어야합니다. on

php.ini 파일에 존재하지 않는 경우 다음 행을 추가해야합니다.

extension=php_openssl.dll

allow_url_fopen = On

둘 다 내 설치에서 On으로 설정되어 있지만 여전히 SSL 오류 "경고 : file_get_contents () : SSL : 핸드 셰이크 시간 초과"가 발생합니다
Adamantus

53

다음을 시도하십시오.

function getSslPage($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

참고 : 이렇게하면 SSL 확인이 비활성화 됩니다 . 즉 , HTTPS에서 제공하는 보안이 손실됩니다 . 이 코드는 테스트 / 로컬 개발 용으로 만 사용 하고 인터넷 이나 기타 공용 네트워크 에서는 사용 하지 마십시오 . 이 코드가 작동하면 SSL 인증서를 신뢰할 수 없거나 확인할 수없는 것이므로 별도의 문제로 해결해야합니다.


29
신용 카드 처리를 처리 할 때 SSL 확인을 비활성화하는 이유는 무엇입니까?
피터

감사합니다. 트릭은 여기에 있습니다. curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE);
Dylan B

46
$url= 'https://example.com';

$arrContextOptions=array(
      "ssl"=>array(
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ),
    );  

$response = file_get_contents($url, false, stream_context_create($arrContextOptions));

이렇게하면 HTTPS인지 여부에 관계없이 URL에서 콘텐츠를 가져올 수 있습니다.


감사! 이것은 내 끝에서 일했습니다. : FB 오픈 그래프 API를 호출하기 위해 노력
decodingpanda

테스트 목적으로 유효하지 않은 인증서로 내 도메인에 액세스하려고했는데 이것이 SSL 유효성 검사를 비활성화하더라도 필요한 것입니다.
carla

큰! 나는 file_get_contents를 사용하여 내 XAMPP 테스트 사이트에서 에어 비앤비 캘린더를 다운로드하기 위해 5 일 동안 노력해 왔는데, 이것이 문제를 해결했습니다. 감사합니다.
JohnnyBeGood

https를 통해 유효한 HTTP 인증서없이 Vagrant 테스트 상자에 연결하려고 시도했습니다. 여기에서 설정되는 PHP SSL 컨텍스트 옵션에 대한 링크 : php.net/manual/en/context.ssl.php ; verify peer = 사용 된 SSL 인증서 확인 필요; verify_peer_name = 동료 이름 확인이 필요합니다.
안토니

이것은 SSL 인증을 깨는 것이 아니고 보안 허점입니까?
webchun 19

10

이는 대상 서버에 유효한 SSL 인증서가 없기 때문일 수 있습니다.


요청 서버에는 SSL 인증서가 필요하지 않습니다.
ceejayoz

15
요청하는 서버를 말하지 않고 대상 서버를 말 했어요.
Emil Vikström

2
그것은 나를 훑어 보는 법을 가르쳐 줄 것입니다. 헤! 제 사과를 받아 주시고 찬성 해주세요.
ceejayoz

대상 서버에 유효한 SSL 인증서가 있습니다.
James Simpson

@James, 대신 cURL로 연결하려고하면 오류가 발생합니까? 아니면 시도하는 것이 절대적으로 불가능합니까?
Emil Vikström

6

php.ini 파일에 두 줄만 추가하면됩니다.

extension=php_openssl.dll

allow_url_include = On

그것은 나를 위해 일하고 있습니다.


1
당신은 아마 의미 allow_url_fopen질문에 대한 우려 URL을 개방하지 포함하기 때문이다.
shukshin.ivan

5

나는 같은 오류가 있었다. 설정 allow_url_include = Onphp.ini나를 위해 수정되었습니다.


5

HTTPS는 OpenSSL 지원으로 컴파일 한 경우 PHP 4.3.0부터 지원됩니다. 또한 대상 서버에 유효한 인증서가 있고 방화벽이 아웃 바운드 연결을 허용 allow_url_fopen하며 php.ini에서 true로 설정되어 있는지 확인하십시오 .


OpenSSL을 지원하는 PHP 5.2.8이 있습니다. 이와 동일한 오류가 발생하고 대상 서버에 유효한 인증서가 있습니다.
James Simpson

2
아웃 바운드 https 연결을 허용하도록 방화벽이 구성되어 있습니까? 일반적으로 https를 실행하는 웹 서버는 포트 80에서 실행되지 않습니다. '스트림 열기 실패'외에 다른 오류가 있습니까?
Gordon

1
내가 아는 한, 이것은 전체 오류입니다. 경고 : fopen (https : // ...) [function.fopen] : 스트림을 열지 못했습니다. / home / user / public_html /에 해당 파일이나 디렉토리가 없습니다. test.php on line 993
James Simpson

php.ini의 allow_url_fopen은 무엇으로 설정됩니까?
Gordon

이상하다. HTTP 및 HTTPS URL에서 GET을 수행하여 작동하는지 확인할 수 있습니까? 스트림 컨텍스트없이?
Gordon

3

제 경우에는 Apache와 다른 CLI 용 php.ini를 사용하는 WAMP로 인해 문제가 발생했기 때문에 WAMP 메뉴를 통해 만든 설정이 CLI에 적용되지 않습니다. CLI php.ini를 수정하면 작동합니다.


1

때때로 서버는 http 요청 헤더 (예 : 적절한 사용자 에이전트)에서 보거나 보지 않는 것에 따라 응답하지 않도록 선택합니다. 브라우저와 연결할 수 있다면 전송하는 헤더를 가져와 스트림 컨텍스트에서 모방하세요.


0

IIS에서 작동하지 않는 https가 붙어있었습니다. 해결 방법 :

file_get_contents ( 'https ..)가로드되지 않습니다.

  • https://curl.haxx.se/docs/caextract.html 다운로드
  • ..phpN.N / extras / ssl에 설치
  • php.ini를 다음과 같이 편집하십시오.

    curl.cainfo = "C : \ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem"openssl.cafile = "C : \ Program Files \ PHP \ v7.3 \ extras \ ssl \ cacert.pem"

드디어!


-1

URL이 있는지 확인하려면

질문의 코드는 작업 버전으로 다시 작성할 수 있습니다.

function send($packet=NULL, $url) {
// Do whatever you wanted to do with $packet
// The below two lines of code will let you know if https url is up or not
$command = 'curl -k '.$url;
return exec($command, $output, $retValue);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.