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

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

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

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

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

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



답변

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

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


답변

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");


답변

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

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

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

전화하기 전에 :

curl_exec():

PHP 파일에서.

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


답변

출처 : 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


답변

위의 솔루션은 훌륭하지만 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


답변

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

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

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

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


답변

연락하려는 응용 프로그램에 자체 서명 된 인증서가있는 경우 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}");