컬 오류 60, SSL 인증서 문제 : 인증서 체인의 자체 서명 된 인증서


81

올바른 APP_ID, APP_SECRET 등을 사용하여 curl 요청을

  https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI 

나는 그것으로부터 access_token을 얻을 필요가 있지만, FALSE를 얻고 curl_error()그렇지 않으면 다음 메시지를 인쇄합니다.

60: SSL certificate problem: self signed certificate in certificate chain

내 코드는 다음과 같습니다.

    // create curl resource
    $ch = curl_init();

    // set url
    curl_setopt($ch, CURLOPT_URL, $url);
    //return the transfer as a string
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // $output contains the output string
    $output = curl_exec($ch);
    if ( ! $output) {
        print curl_errno($ch) .': '. curl_error($ch);
    }

    // close curl resource to free up system resources
    curl_close($ch);

    return $output;

위의 링크로 수동 이동하면 access_token이 잘됩니다. 컬과 함께 작동하지 않는 이유는 무엇입니까? 도와주세요.


.crt확장 이있는 인증서를 받아야 할까요? 그러나 나는 그를 얻을하는 방법을 모른다
빅터 Bocharsky

1
[깨진] 수락 된 답변은 피하십시오. 대신 @erlangsec의 대답을 사용하십시오. 또한 세상에서 가장 위험한 코드 : 브라우저가 아닌 소프트웨어에서 SSL 인증서 유효성 검사를 참조하세요 .
jww

답변:


180

비활성화를 제안하는 답변 CURLOPT_SSL_VERIFYPEER은 허용되지 않아야합니다. 질문은 "왜 cURL에서 작동하지 않는지"이며 Martijn Hols가 올바르게 지적했듯이 위험합니다.

이 오류는 CA 루트 인증서의 최신 번들이 없기 때문에 발생했을 수 있습니다. 일반적으로 curl이 호스트의 SSL 인증서를 확인하는 데 사용하는 암호화 서명이 포함 된 텍스트 파일입니다.

PHP 설치에 이러한 파일 중 하나가 있고 최신 파일인지 확인해야합니다 (그렇지 않으면 http://curl.haxx.se/docs/caextract.html에서 다운로드 하십시오 ).

그런 다음 php.ini에서 설정하십시오 .

curl.cainfo = <absolute_path_to> cacert.pem

런타임에 설정하는 경우 다음을 사용하십시오.

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

1
감사합니다.하지만 외부 API 작업에 대한 제안을 찾고있었습니다. 그래서 @SabujHassan을 제안하는 제안은 작동하며 내가 이해했듯이 내가 사용한 API는 SSL을 제공하지 않습니다.
Victor Bocharsky 2014 년

탁월한 솔루션. 대단히 :) 감사
찬드라 Nakka에게

1
마법처럼 작동합니다. 이것이 답이되어야합니다. "수락 된 답변"은 쉽지만 보안상의 이유로 나쁜 방법입니다.
KristCont

감사합니다, 말한대로 훌륭하게 작동합니다! 이것은 실제로 정답이어야합니다.
PostMans

2
curl.cainfo는 PHP 7.1 / 7.2의 phpinfo ()에 표시되지 않지만 openssl.cafile은 표시되지 않습니다. php.net/manual/en/curl.configuration.php
엘리야 린

58

이 해결 방법은 위험 하고 바람직하지 :

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

SSL 피어 확인을 비활성화하는 것은 좋은 생각이 아닙니다. 그렇게하면 MITM 공격자에게 요청이 노출 될 수 있습니다.

실제로 최신 CA 루트 인증서 번들 만 있으면됩니다. 업데이트 된 설치는 다음과 같이 쉽습니다.

  1. cURL 웹 사이트cacert.pem 에서 최신 파일 다운로드 및

  2. php.ini 파일에 경로 설정 (예 : Windows) :

    curl.cainfo=c:\php\cacert.pem

그게 다야!

안전하고 안전하게 지내십시오.


5
전역 php.ini파일 을 편집 할 권한이없는 경우 코드에서이 옵션을 설정할 수도 있습니다. curl_setopt ($curl_ch, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
zxcmehran

2
개발 환경에서 작업
cmedeiros

2
dev에 ENV에 테스트를위한 좋은
Gaurav 라이를

이것은 끔찍한 조언이며 답변을 삭제해야합니다.
miken32

4
@ miken32 네, 그런 다음 위험한 해결 방법을 대체하는 대체 안전한 솔루션을 제안합니다. 끝까지 계속 읽으십시오.
zxcmehran

3

SSL 인증서가 시스템에 제대로 설치되지 않은 경우 다음 오류가 발생할 수 있습니다.

cURL 오류 60 : SSL 인증서 문제 : 로컬 발급자 인증서를 가져올 수 없습니다.

이 문제는 다음과 같이 해결할 수 있습니다.

https://curl.haxx.se/ca/cacert.pem 에서 업데이트 된 인증서 목록이있는 파일을 다운로드합니다.

다운로드 한 cacert.pem파일을 시스템의 안전한 위치로 이동합니다.

php.ini파일을 업데이트 하고 해당 파일의 경로를 구성하십시오.


또한 openssl.cafile="C:/dev/ssl/mywebsite.local.crt"­php.ini
François Breton

3

중요 :이 문제는 며칠 동안 저를 미치게했고 curl 및 openssl 설치에서 무슨 일이 벌어지고 있는지 알 수 없었습니다. 마침내 구식 인 중간 인증서 (제 경우에는 GoDaddy)라는 사실을 알게되었습니다. godaddy SSL 관리자 패널로 돌아가서 새 중간 인증서를 다운로드했는데 문제가 사라졌습니다.

여러분 중 일부에게는 이것이 문제라고 확신합니다.

분명히 GoDaddy는 보안 문제로 인해 어느 시점에서 중간 인증서를 변경했으며 이제 다음 경고를 표시합니다.

"다운로드 한 번들에 포함 된 새 SHA-2 중간 인증서를 사용해야합니다."

내가 미쳐 가고 모든 서버에서 문제를 해결했기 때문에 이것이 여러분 중 일부에게 도움이되기를 바랍니다.


질문과 정확히 관련되지는 않지만 일반적으로 실행 가능한 정보를 제공 할 수 있습니다.
peter.hrasko.sk

curl에서 생성하는 오류 메시지는 때때로 비밀스럽고 오해의 소지가있을 수 있으며, "자체 서명 된 인증서"오류를받은 일부 사람들은 내가 인용 한 기이함으로 인해 오류가 발생했다고 확신합니다. 또한 curl을 빌드 할 때 구성 문자열 ./configure --with-ca-bundle = / etc / ssl / certs / ca-bundle.crt를 사용했으며 perl 스크립트 lib / mk도 사용했습니다. -ca-bundle.pl은 멋진 새 ca-bundle.crt 파일을 생성합니다. 아파치 웹 서버를 사용하고 있었지만 기존 중간 인증서를 godaddy의 업데이트 된 인증서로 바꾸지 않았습니다.
Lee

-3

오류 : SSL 인증서 문제 : 인증서 체인의 자체 서명 된 인증서

Solution:
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);    
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.