HTTPS 및 SSL3_GET_SERVER_CERTIFICATE : 인증서 확인 실패, CA가 정상 임


208

개발에 XAMPP 를 사용 하고 있습니다. 최근에 xampp 설치를 이전 버전에서 1.7.3으로 업그레이드했습니다.

이제 HTTPS 사용 사이트를 컬링하면 다음 예외가 발생합니다.

치명적인 오류 : 'cURL 리소스가 포함 된'RequestCore_Exception '예외가 발견되었습니다. cURL 오류 : SSL 인증서 문제입니다. CA 인증서가 올바른지 확인하십시오. 세부 사항 : 오류 : 14090086 : SSL 루틴 : SSL3_GET_SERVER_CERTIFICATE : 인증서 확인 실패 (60) '

이 문제를 해결하기 위해 PHP 코드의 특정 curl 옵션을 사용하는 것이 좋습니다. 나는 이것이 길이되어서는 안된다고 생각합니다. 이전 버전의 XAMPP에 문제가 없었고 새 버전을 설치 한 후에 만 ​​발생했기 때문입니다.

PHP 설치에서 변경되는 설정, Apache 등 이이 문제를 해결할 수 있는지 알아내는 데 도움이 필요합니다.

답변:


145

curl은 허용 된 CA 목록을 포함하는 데 사용되었지만 더 이상 모든 CA 인증서를 번들로 제공하지 않습니다. 따라서 기본적으로 모든 SSL 인증서를 확인할 수없는 것으로 거부합니다.

CA 인증서를 취득하고 컬을 가리켜 야합니다. 서버 SSL 인증서에 대한 cURLS 세부 사항에서 자세한 내용을 참조하십시오 .


4
컬은 아마존 웹 서비스 PHP 라이브러리에서 발생합니다. 라이브러리 코드를 편집하지 않고 문제를 해결하는 방법을 이해하지 못했습니다.
Josnidhin 2016 년

41
그런 다음 인증서 확인을 끄십시오 ( CURLOPT_SSL_VERIFYPEER-> false). SSL을 사용하려는 사이트의 CA 인증서를 추가하거나 CA 확인을 비활성화하십시오. 이 두 가지 옵션 만 사용할 수 있습니다.
Marc B

78
단지 fyi — SSL 사용 목적 CURLOPT_SSL_VERIFYPEERfalse무효화하는 설정 입니다.
까지

13
@Tills는 SSL의 목적 절반 을 물리 치지 않습니까? 당신은 여전히 ​​당신과 당신의 동료 사이의 프라이버시를 얻는다 : 당신은 단지 당신의 동료의 진위가 없다.
Mark Fox

10
진위가 없다면 전송하는 데이터를 암호화하는 데있어 요점은 무엇입니까? 당신은 다음 MITMed했던 데이터는 어쨌든 손상된 경우
hdgarrood

290

Windows에서 매우 일반적인 문제입니다. 로 설정 cacert.pem하면 curl.cainfo됩니다.

PHP 5.3.7부터 다음을 수행 할 수 있습니다.

  1. https://curl.haxx.se/ca/cacert.pem을 다운로드 하여 어딘가에 저장하십시오.
  2. 업데이트 php.ini-curl.cainfo = "PATH_TO / cacert.pem"추가

그렇지 않으면 모든 cURL 리소스에 대해 다음을 수행해야합니다.

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

2
이것은 OS X의 XAMPP에서 나를 위해 일했습니다. 로컬 인증서를 찾을 수 없어 Wordpress 플러그인이 업데이트되지 않는 문제가 해결되었습니다.
Jonathan Nicol

8
Apache를 사용하여 Windows 에서이 문제를 해결하려는 다른 사람은 PHP 코드에서 전체 경로 (예 : C : \ PATH_TO \ cacert.pem)를 설정해야했습니다. IIS에서는 상대 경로가 정상적으로 작동하는 것 같습니다.
http203

cacert.pem이 동일한 디렉토리에 있으면 curl_setopt ($ ch, CURLOPT_CAINFO, dirname ( FILE ). '/cacert.pem'); 작동합니다
mujaffars

7
와 함께 WampServer를 사용 2.하는 경우 변수를 두 개의 개별 php.ini파일에 추가해야 합니다.
Nate

수수께끼 / 비철 한 것은 추가 옵션을 지정하지 않고 HTTPS를 통해 curl.haxx.se/ca/cacert.pem 을 다운로드 할 수 있다는 것 입니다. curl.haxx.se에 대한 인증서가 curl 자체로 백업됩니까?
qbolec

84

경고 : SSL이 보호하도록 설계된 보안 문제가 발생하여 전체 코드베이스가 안전하지 않을 수 있습니다. 모든 권장 사례에 위배됩니다.

그러나 나를 위해 일한 정말 간단한 수정은 전화였습니다.

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

전화하기 전에 :

curl_exec():

PHP 파일에서.

SSL 인증서의 모든 확인을 비활성화한다고 생각합니다.


65
... 및 인증서 확인을 비활성화하면 SSL / TLS가 보호 할 수있는 잠재적 인 MITM 공격에 대한 문을 열어 둡니다. 이러지 마!
Bruno

12
예. 나는 대답에서 이것에 더 많은 관심을 기울여야했다. 중요한 작업을하지 않는 경우에만이 작업을 수행하십시오. 로컬 호스트에서 개인적으로 프로그래밍 한 웹 사이트에 액세스하는 데 사용합니다.
Chris Dutrow

3
나에게서 공감. 이것은 코드가 작동하도록하는 더러운 해결책이지만 해결책은 아닙니다. Артур Курицын의 답변이 훨씬 좋습니다.
Ilija

2
@Bruno 이것은 도우미 스크립트, 테스트, 신뢰할 수있는 응용 프로그램, 인트라넷 등을위한 완벽한 솔루션입니다. SSL에 대해 조금만 알고 있다면 누구나 인증서 유효성 검사를 건너 뛸 수 있다는 것을 알고 있습니다. 따라서이 답변에 대한 모든 '똑똑한'댓글과 '이것을 수행하지 마십시오'와 같은 것들은 단지 놀랍습니다!
Kenyakorn Ketsombut

5
... " SSL에 대해 약간의 지식을 알고있는 사람은 [...] "... 그리고 SSL / TLS의 기본 사항에 대해 조금 아는 사람도 없는데 놀랍니다. 오류 메시지의 빠른 수정 사항을 복사 / 붙여 넣기
Bruno

53

출처 : http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html

컬 : SSL 인증서 문제, CA 인증서가 올바른지 확인하십시오.

2006 년 4 월 7 일

Curl로 보안 URL을 열면 다음 오류가 발생할 수 있습니다.

SSL 인증서 문제, CA 인증서가 올바른지 확인하십시오.

왜 오류가 발생했는지 그리고 어떻게해야하는지 설명하겠습니다.

오류를 제거하는 가장 쉬운 방법은 스크립트에 다음 두 줄을 추가하는 것입니다. 이 솔루션은 보안 위험을 초래합니다.

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

이 두 매개 변수가 무엇을하는지 보자. 매뉴얼 인용.

CURLOPT_SSL_VERIFYHOST : 1-SSL 피어 인증서에 공통 이름이 있는지 확인하십시오. 2를 사용하여 공통 이름이 있는지 확인하고 제공된 호스트 이름과 일치하는지 확인하십시오.

CURLOPT_SSL_VERIFYPEER : CURL이 피어의 인증서 확인을 중지하려면 FALSE입니다. 확인할 다른 인증서는 CURLOPT_CAINFO 옵션으로 지정하거나 인증서 디렉토리는 CURLOPT_CAPATH 옵션으로 지정할 수 있습니다. CURLOPT_SSL_VERIFYPEER가 비활성화 된 경우 CURLOPT_SSL_VERIFYHOST도 TRUE 또는 FALSE 일 수 있습니다 (기본값은 2). CURLOPT_SSL_VERIFYHOST를 2 (기본값)로 설정하면 사용자에게 제공되는 인증서에 원격 리소스에 액세스하는 데 사용하는 URN과 일치하는 '공통 이름'이 있음을 보증합니다. 이것은 건전한 점검이지만 프로그램이 속지 않는다고 보장하지는 않습니다.

'중간자'를 입력하십시오

프로그램이 대신 다른 서버와 통신하도록 오도 될 수 있습니다. 이것은 dns 또는 arp 중독과 같은 여러 메커니즘을 통해 달성 될 수 있습니다 (이것은 다른 날의 이야기입니다). 침입자는 프로그램이 예상하는 동일한 'comon name'으로 인증서에 자체 서명 할 수도 있습니다. 의사 소통은 여전히 ​​암호화되어 있지만 사기꾼에게 비밀을 알려줄 것입니다. 이런 종류의 공격을 '중간자'라고합니다

'중간에있는 남자'를 물리 치기

우리에게 제공되는 인증서가 실제에 적합한 지 확인해야합니다. 우리는 이것을 합리적인 * 신뢰하는 인증서와 비교함으로써이를 수행합니다.

Verisign, GeoTrust 등의 주요 CA 중 하나에서 발급 한 인증서로 원격 리소스를 보호하는 경우 http://curl.haxx.se/docs/caextract 에서 얻을 수있는 Mozilla의 CA 인증서 번들과 안전하게 비교할 수 있습니다 . .html

cacert.pem서버 어딘가에 파일을 저장하고 스크립트에서 다음 옵션을 설정하십시오.

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

위의 모든 정보 크레디트에 대한 정보 : http://ademar.name/blog/2006/04/curl-ssl-certificate-problem-v.html


38
일반적으로 정보의 출처를 밝히고 여기에 단순히 복사하여 붙여 넣기보다는 질문과 관련된 특정 부분 만 인용하는 것이 예의 바른 것으로 간주됩니다!
Dan Herd

1
죄송합니다, 나는 그것에 대해 댄 appricate 그래, 멀리 있었고 포스트 업데이트 한
디팍 오베로이

6
적어도 Deepak은 그것을 연구하기 위해 노력했습니다. @ danherd 그래서 danherd, 당신은 그가 어딘가에서 코드를 가져간 것을 발견하기 위해 연구를 했습니까? 이 코드의 귀속 권은 무엇입니까? 다른 사람의 실수를 찾기 위해 시간을 낭비하지 말고 자신을 도와주십시오. 싸우지 말고 공유하십시오!
GTodorov

17

위의 솔루션은 훌륭하지만 WampServer를 사용하는 경우 curl.cainfo변수 설정이 php.ini작동하지 않을 수 있습니다.

결국 WampServer에 두 개의 php.ini파일 이 있음을 발견했습니다 .

C:\wamp\bin\apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

첫 번째는 웹 브라우저를 통해 PHP 파일을 호출 할 때 사용되는 반면, 두 번째는 명령 줄 또는을 통해 명령을 호출 할 때 사용됩니다 shell_exec().

TL; DR

WampServer를 사용하는 경우 파일 모두에curl.cainfo 라인을 추가해야 합니다. php.ini


6

거룩하신 모든 것의 사랑을 위해 ...

필자의 경우 openssl.cafilePHP 구성 변수를 PEM 파일 경로 로 설정해야했습니다 .

curl.cainfoPHP의 설정 에서 설정 이 필요한 시스템이 많지만 Debian 8 (jessie) 및 PHP를 사용 하는 eboraas / laravel docker container 인 작업 환경에서 많은 시스템이 있다는 것은 매우 사실입니다 5.6, 그 변수를 설정하면 트릭을하지 못했습니다.

출력의 php -i특정 구성 설정에 대해서는 언급하지 않았지만에 대한 몇 줄이 openssl있습니다. 모두가 openssl.capathopenssl.cafile옵션, 그러나 다만 마지막으로 HTTPS URL을 괜찮을 PHP를 통해 두 번째 허용 컬 설정은.


감사합니다! curl.cainfo를 설정해도 효과가 없었지만 openssl.cafile을 설정하면 효과가 없습니다! XAMPP 및 PHP 7.1.1이 설치된 Windows 7을 사용하고 있습니다.
knezmilos

@knezmilos openssl.ca 파일을 어떻게 설정 했습니까? 어디에서 다운로드했으며 어떻게 활성화합니까?
Krys

글쎄, 그것은 오래되었지만 PHP와 같은 curl.cainfo = "C : \ xampp \ cacert \ cacert.pem"및 openssl.cafile = "C : \ xampp \ cacert \ cacert.pem"과 같은 것 같습니다. ini, 나는 여기에 대한 답변 중 하나에서 pem 파일을 얻었습니다.
knezmilos

1
"거룩한 모든 사람의 사랑을 위하여 ..." 이것은 내 Ubuntu 18.08 / Apache / Php7.2 설정에서 작동했습니다. 컬 오류가 올바른 파일을 가리키는 경우 가장 확실하게 openssls 오류입니다.
JTG

4

연락하려는 응용 프로그램에 자체 서명 된 인증서가있는 경우 http://curl.haxx.se/ca/cacert.pem 의 일반 cacert.pem으로 문제가 해결되지 않는 경우가 있습니다.

서비스 엔드 포인트 URL에 대해 확신이있는 경우, 브라우저를 통해 해당 URL을 확인하고 "PEM (Chain with Chain) 인증서"형식으로 인증서를 수동으로 저장하십시오. 이 인증서 파일을

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   

4

Amazon AMI Linux에서 동일한 오류가 있습니다.

/etc/php.d/curl.ini에서 curl.cainfo 를 설정하여 해결했습니다.

https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

2018 년 10 월 추가

Amazon Linux v1에서이 파일을 편집하십시오.

vi /etc/php.d/20-curl.ini

이 줄을 추가하려면

curl.cainfo="/etc/ssl/certs/ca-bundle.crt"

고마워요! 다른 답변을 만들지 않고 문제를 해결 한 작업을 정확하게 추가하기 위해 질문을 업데이트했습니다.
Tim

3

CURLOPT_CAINFO의 컬 옵션을 설정할 때 작은 따옴표를 사용해야합니다. 큰 따옴표를 사용하면 다른 오류 만 발생합니다. 따라서 옵션은 다음과 같아야합니다.

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

또한 php.ini 파일 설정에서 다음과 같이 작성해야합니다. (내 큰 따옴표에 유의하십시오)

curl.cainfo = "C:\wamp\www\mywebfolder"

나는 이것을 말하는 줄 바로 아래에 넣었습니다. extension=php_curl.dll

(조직화 목적으로 만 어디든지 넣을 수 있습니다. php.ini키워드 컬을 사용하여 검색 할 때 한 컬에서 두 컬 참조를 모두 찾을 수 있으므로 다른 컬 참조에 가깝게 배치 할 수 있습니다.)


1
나는 php.ini 파일 대신 상위 폴더의 PEM 파일을 가리켜 야 희망
dejjub-AIS에게

2

www.googleapis.com에서 페이지를 얻기 위해 GuzzleHttp (Mac의 경우 PHP + apache)를 얻으려고 할 때 여기에 도착했습니다.

여기에 누군가를 도울 수있는 마지막 해결책이 있습니다.

이 오류를 발생시키는 도메인에 대한 인증서 체인을 확인하십시오. 나를 위해 그것은 googleapis.com이었다

openssl s_client -host www.googleapis.com -port 443

다음과 같은 것을 다시 얻을 수 있습니다.

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

참고 : 문제를 해결 한 후에 이것을 캡처하면 체인 출력이 다르게 보일 수 있습니다.

그런 다음 PHP에서 허용되는 인증서를 확인해야합니다. 페이지에서 phpinfo ()를 실행하십시오.

<?php echo phpinfo();

그런 다음 페이지 출력에서로드 된 인증서 파일을 찾으십시오.

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

올바른 인증서를 추가하여 수정해야하는 파일입니다.

sudo nano /usr/local/php5/ssl/certs/cacert.pem

기본적으로이 파일의 끝에 올바른 인증서 "서명"을 추가해야합니다.

여기에서 그 중 일부를 찾을 수 있습니다. 필요한 경우 체인의 다른 사용자를 Google / 검색해야 할 수도 있습니다.

그들은 다음과 같이 보입니다 :

인증서 이미지 예

( 참고 : 이것은 이미지이므로 사람들은 단순히 인증서를 복사 / 붙여 넣기하지 않습니다 )

올바른 인증서가이 파일에 있으면 아파치를 다시 시작하고 테스트하십시오.



-5

해결책은 매우 간단합니다! 이 줄을 앞에 두십시오 curl_exec:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

나를 위해 작동합니다.


7
결코, 이제까지 데이터가 전송 중에 손상되면 해제 피어 검증 당신은 상관하지 않는 한.
rdlowrey 2014 년

동의했다. 안전한 앱을 원한다면 피어 검증이 필요합니다.
braden

2
"브라우저 확인을 비활성화하지 마십시오"기본 브라우저 기능을 원하지 않는 한 haha. 또한 왜 그렇게 많이 하향 조정됩니까? 이것은 짧고 달콤하고 요점과 효과에 대한 유일한 답입니다.
Adam F

@AdamF 참고로, 브라우저는 기본적으로 피어 인증서를 확인하지만 경고와 함께 수동으로 오류를 무시하는 옵션 만 제공합니다.
Bruno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.