cURL을 사용하여 HTTPS 사이트에 연결할 수 없습니다. 0 길이의 콘텐츠를 대신 반환합니다. 내가 무엇을 할 수 있을지?
PHPcURL을 사용하여 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.curl_error ()에서 오류 메시지를 확인해보십시오. 각 curl_ * 함수 다음에이 작업을 한 번 수행해야 할 수도 있습니다.
curl_error ()에서 오류 메시지를 확인해보십시오. 각 curl_ * 함수 다음에이 작업을 한 번 수행해야 할 수도 있습니다.
http://www.php.net/curl_error
-
==============================
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.참고 : 이것은 실제 업무용이 아닙니다. 신속하게 디버그하고 싶다면이 방법이 유용 할 수 있습니다. 그렇지 않으면 위의 @ SchizoDuckie의 대답을 사용하십시오.
참고 : 이것은 실제 업무용이 아닙니다. 신속하게 디버그하고 싶다면이 방법이 유용 할 수 있습니다. 그렇지 않으면 위의 @ SchizoDuckie의 대답을 사용하십시오.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
그냥 추가하십시오. 그것은 작동합니다.
-
==============================
4.그냥 아주 비슷한 문제가 있었고 그것을 추가하여 해결했습니다.
그냥 아주 비슷한 문제가 있었고 그것을 추가하여 해결했습니다.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
필자가 가져 오는 사이트는 다른 위치로 리다이렉트하고 php-curl은 기본적으로 리디렉션을 따르지 않습니다.
-
==============================
5.나는 이것이 도움이되는 상황을 가지고있다. (Windows의 PHP 5.4.16)
나는 이것이 도움이되는 상황을 가지고있다. (Windows의 PHP 5.4.16)
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
-
==============================
6.PHP / Curl로 테스트 할 때마다 먼저 커맨드 라인에서 시도해보고, 어떤 것이 작동하는지 파악한 다음 PHP로 옵션을 포팅합니다.
PHP / Curl로 테스트 할 때마다 먼저 커맨드 라인에서 시도해보고, 어떤 것이 작동하는지 파악한 다음 PHP로 옵션을 포팅합니다.
-
==============================
7.때로는 https로 오류가 발생하지 않도록 Curl 인증서를 최신 버전으로 업그레이드해야합니다.
때로는 https로 오류가 발생하지 않도록 Curl 인증서를 최신 버전으로 업그레이드해야합니다.
-
==============================
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.게이트웨이에 대한 보안 통신을 테스트하고있는 곳에서 웹 호스팅 회사에 문제가있을 수 있으며, 그렇게하지 않을 수도 있습니다.
게이트웨이에 대한 보안 통신을 테스트하고있는 곳에서 웹 호스팅 회사에 문제가있을 수 있으며, 그렇게하지 않을 수도 있습니다.
또한 원격 호스트에 연결하기 전에 제공해야하는 사용자 이름, 암호가있을 수 있습니다.
또는 통신을 시작할 원격 서버의 IP가 승인 된 IP 목록에 있어야 할 수도 있습니다.
-
==============================
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.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.POST 메서드를 사용하고 있지만 데이터 배열을 제공하고 있습니까? 예 :
POST 메서드를 사용하고 있지만 데이터 배열을 제공하고 있습니까? 예 :
curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
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
'PHP' 카테고리의 다른 글
배열 목록에서 배열 트리 만들기 (0) | 2018.09.19 |
---|---|
.htaccess를 사용하여 디렉토리 (모든 하위 디렉토리 포함)에서 PHP를 비활성화합니다. (0) | 2018.09.19 |
URL에서 'public / index.php'를 어떻게 제거 할 수 있습니까? (0) | 2018.09.19 |
참조에 의한 PHP Foreach Pass : 마지막 요소 복제? (곤충?) (0) | 2018.09.19 |
SUDO가 필요한 PHP에서 쉘 스크립트를 호출하는 방법은 무엇입니까? (0) | 2018.09.19 |