복붙노트

cURL을 사용하여 HTTPS 사이트에 연결할 수 없습니다. 0 길이의 콘텐츠를 대신 반환합니다. 내가 무엇을 할 수 있을지?

PHP

cURL을 사용하여 HTTPS 사이트에 연결할 수 없습니다. 0 길이의 콘텐츠를 대신 반환합니다. 내가 무엇을 할 수 있을지?

cURL (최신 버전)을 사용하여 결제를위한 보안 게이트웨이에 연결하는 사이트가 있습니다.

문제는 cURL이 항상 길이가 0 인 콘텐츠를 반환한다는 것입니다. 헤더 만받습니다. 그리고 헤더를 반환하도록 cURL을 설정할 때만. 나는 다음과 같은 플래그를 가지고있다.

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL, $gatewayURI);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_POST, 1);

반환 된 헤더는 다음과 같습니다.

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Tue, 25 Nov 2008 01:08:34 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Content-Length: 0
Content-Type: text/html
Set-Cookie: ASPSESSIONIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; path=/
Cache-control: private

나는 또한 다른 사이트를 cURL'ing 시도하고 그들은 내용을 잘 반환합니다. 문제는 https 연결과 관련이 있다고 생각합니다.

나는 회사와 대화를 나눴고 도움이되지 않는다.

다른 누구도이 오류가 발생하여 해결 방법을 알고 있습니까? 나는 cURL을 버리고 fsockopen ()을 시도하고 사용해야합니까?

고맙습니다. :)

해결법

  1. ==============================

    1.curl_error ()에서 오류 메시지를 확인해보십시오. 각 curl_ * 함수 다음에이 작업을 한 번 수행해야 할 수도 있습니다.

    curl_error ()에서 오류 메시지를 확인해보십시오. 각 curl_ * 함수 다음에이 작업을 한 번 수행해야 할 수도 있습니다.

    http://www.php.net/curl_error

  2. ==============================

    2.오늘도 똑같은 문제가있었습니다. 컬에는 HTTPS 인증서를 인증 할 수있는 오래된 파일이 있습니다.

    오늘도 똑같은 문제가있었습니다. 컬에는 HTTPS 인증서를 인증 할 수있는 오래된 파일이 있습니다.

    새로운 것을 얻으십시오 :

    http://curl.haxx.se/ca/cacert.pem

    귀하의 사이트의 일부 디렉토리에 저장하십시오.

    추가

    curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem"); 
    

    모든 요청에 ​​:-)

    CURLOPT_VERIFYPEER 및 CURLOPT_VERIFYHOST를 사용 중지하는 것에 대한 모든 바보 같은 의견을 무시하십시오 !! 따라서 중간 공격에서 코드가 사람에게 취약 해집니다!

    2016 년 12 월 편집 :

    아래에 설명 된 Jasen의 방법을 사용하여이를 올바르게 해결하십시오.

    curl.cainfo = / etc / ssl / certs / ca-certificates.crt를 php.ini에 추가하십시오.

    10 월 2017 편집 :

    현재 CA 인증서를 관리하는 데 도움이되는 작성자 패키지가 있으므로 인증서를 취소함으로써 cacert.pem이 오래된 것으로 변한 경우에도 취약하지 않습니다.

    https://github.com/paragonie/certainty -> 작곡가는 모범 / 확실성이 필요합니다 : dev-master

  3. ==============================

    3.참고 : 이것은 실제 업무용이 아닙니다. 신속하게 디버그하고 싶다면이 방법이 유용 할 수 있습니다. 그렇지 않으면 위의 @ SchizoDuckie의 대답을 사용하십시오.

    참고 : 이것은 실제 업무용이 아닙니다. 신속하게 디버그하고 싶다면이 방법이 유용 할 수 있습니다. 그렇지 않으면 위의 @ SchizoDuckie의 대답을 사용하십시오.

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);     
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    

    그냥 추가하십시오. 그것은 작동합니다.

  4. ==============================

    4.그냥 아주 비슷한 문제가 있었고 그것을 추가하여 해결했습니다.

    그냥 아주 비슷한 문제가 있었고 그것을 추가하여 해결했습니다.

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    

    필자가 가져 오는 사이트는 다른 위치로 리다이렉트하고 php-curl은 기본적으로 리디렉션을 따르지 않습니다.

  5. ==============================

    5.나는 이것이 도움이되는 상황을 가지고있다. (Windows의 PHP 5.4.16)

    나는 이것이 도움이되는 상황을 가지고있다. (Windows의 PHP 5.4.16)

    curl_setopt($ch, CURLOPT_SSLVERSION, 3);
    
  6. ==============================

    6.PHP / Curl로 테스트 할 때마다 먼저 커맨드 라인에서 시도해보고, 어떤 것이 작동하는지 파악한 다음 PHP로 옵션을 포팅합니다.

    PHP / Curl로 테스트 할 때마다 먼저 커맨드 라인에서 시도해보고, 어떤 것이 작동하는지 파악한 다음 PHP로 옵션을 포팅합니다.

  7. ==============================

    7.때로는 https로 오류가 발생하지 않도록 Curl 인증서를 최신 버전으로 업그레이드해야합니다.

    때로는 https로 오류가 발생하지 않도록 Curl 인증서를 최신 버전으로 업그레이드해야합니다.

  8. ==============================

    8.stream_create_context를 사용하여 file_get_contents를 사용했는데 제대로 작동합니다.

    stream_create_context를 사용하여 file_get_contents를 사용했는데 제대로 작동합니다.

    $postdataStr = http_build_query($postdataArr);
    
    $context_options = array (
            'http' => array (    <blink> // this will allways be http!!!</blink>
                'method' => 'POST',
                'header'=> "Content-type: application/x-www-form-urlencoded\r\n"
                    . "Content-Length: " . strlen($postdataArr) . "\r\n"
                    . "Cookie: " . $cookies."\r\n"
                'content' => $postdataStr
                )
            );
    
    $context = stream_context_create($context_options);
    $HTTPSReq = file_get_contents('https://www.example.com/', false, $context);
    
  9. ==============================

    9.게이트웨이에 대한 보안 통신을 테스트하고있는 곳에서 웹 호스팅 회사에 문제가있을 수 있으며, 그렇게하지 않을 수도 있습니다.

    게이트웨이에 대한 보안 통신을 테스트하고있는 곳에서 웹 호스팅 회사에 문제가있을 수 있으며, 그렇게하지 않을 수도 있습니다.

    또한 원격 호스트에 연결하기 전에 제공해야하는 사용자 이름, 암호가있을 수 있습니다.

    또는 통신을 시작할 원격 서버의 IP가 승인 된 IP 목록에 있어야 할 수도 있습니다.

  10. ==============================

    10.최근 응용 프로그램 프로젝트에서이 오류를 발견했습니다. 명령 줄이나 브라우저 창에서 실행하려고 했으므로 서버 검색을 사용하여 요청한 문서의 상대 URL을 얻었습니다. 문제는 사이트가 https이고 http : // (동일한 서버)에 액세스하려고 할 때마다 cURL이 도움이되어 https로 변경된다는 것입니다.

    최근 응용 프로그램 프로젝트에서이 오류를 발견했습니다. 명령 줄이나 브라우저 창에서 실행하려고 했으므로 서버 검색을 사용하여 요청한 문서의 상대 URL을 얻었습니다. 문제는 사이트가 https이고 http : // (동일한 서버)에 액세스하려고 할 때마다 cURL이 도움이되어 https로 변경된다는 것입니다.

    이 잘 브라우저에서 작동하지만 명령 줄에서 다음 두 SSL 오류가 false로 설정된 경우에도 확인하십시오. 내가해야 할 일은,

    1) $ _SERVER [ 'HTTP_HOST']를 확인하십시오. 있다면 ($ _SERVER [ 'HTTPS']? "https : //": "http : //") $ _ SERVER [ 'HTTP_HOST']

    2) $ _SERVER [ 'COMPUTERNAME']을 확인하고 프로덕션 서버와 일치하는 경우 https URL을 제공하십시오. ( "https : // (servername)")

    3) 조건이 모두 통과되지 않으면 다른 서버에서 명령 줄을 실행하고 "http : // localhost"를 사용한다는 의미입니다.

    이제이 방법이 효과적 이었지만 해킹입니다. 또한, 한 서버 (https)에서 URL을 변경 한 이유는 무엇인지 알지 못했지만 다른 URL (https)에서도 내 URL을 혼자 남겨 두었습니다.

    기묘한.

  11. ==============================

    11.https를 사용하고 보안 문제를 피하는 가장 좋은 방법은 Firefox (또는 다른 도구)를 사용하여 서버에 인증서를 다운로드하는 것입니다. 이 웹 페이지는 저에게 많은 도움이되었습니다. 이러한 것들이 저에게 효과적이었습니다.

    https를 사용하고 보안 문제를 피하는 가장 좋은 방법은 Firefox (또는 다른 도구)를 사용하여 서버에 인증서를 다운로드하는 것입니다. 이 웹 페이지는 저에게 많은 도움이되었습니다. 이러한 것들이 저에게 효과적이었습니다.

    1) Firefox에서 CURL과 함께 사용할 URL을 엽니 다.

    2) 주소 표시 줄에서 자물쇠> 자세한 정보를 클릭하십시오 (FF 버전은 다른 메뉴를 가질 수 있습니다.). 인증서보기 버튼> 세부 정보 탭을 클릭하십시오.

    3) 인증서 계층에서 "올바른"인증서를 강조 표시합니다. 필자의 경우 "cPanel, Inc. Certification Authority"라고 불리는 세 번째 제품 중 두 번째 제품이었습니다. 방금 "시행 착오"방법으로 올바른 것을 발견했습니다.

    4) 내보내기 단추를 누르십시오. 필자의 경우 파일 형식이 "체인이있는 PEM"이었습니다 (다시 시행 착오 방식으로).

    5) 그런 다음 PHP 스크립트에 다음을 추가하십시오.

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);    
    curl_setopt($ch, CURLOPT_CAINFO, [PATH_TO_CRT_FILE]);
    

    또한이 단계를 1 년에 한 번 또는 URL 인증서를 교체하거나 갱신 할 때마다 다시해야한다는 사실에주의해야한다고 말하고 싶습니다.

  12. ==============================

    12.POST 메서드를 사용하고 있지만 데이터 배열을 제공하고 있습니까? 예 :

    POST 메서드를 사용하고 있지만 데이터 배열을 제공하고 있습니까? 예 :

    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    
  13. from https://stackoverflow.com/questions/316099/cant-connect-to-https-site-using-curl-returns-0-length-content-instead-what-c by cc-by-sa and MIT license