PHP-SSL 인증서 오류 : 로컬 발급자 인증서를 가져올 수 없습니다


189

Windows 7에서 XAMPP의 일부로 PHP 버전 5.6.3을 실행하고 있습니다.

Mandrill API를 사용하려고하면 다음 오류가 발생합니다.

'메시지 / 송신 템플릿에 대한 API 호출 실패 : SSL 인증서 문제 : 로컬 발급자 인증서를 가져올 수 없음'메시지와 함께 'Mandrill_HttpError'예외가 발생했습니다.

php.ini 파일에 다음을 추가하는 것을 포함하여 StackOverflow에서 읽은 모든 것을 이미 시도했습니다.

curl.cainfo = "C:\xampp\php\cacert.pem"

물론 http://curl.haxx.se/docs/caextract.html 에서 cacert.pem 파일을 해당 위치로 다운로드했습니다 .

그러나 결국 XAMPP와 Apache 서버를 다시 시작했지만 여전히 동일한 오류가 발생합니다.

나는 무엇을 시도 해야할지 정말로 모른다.

누구든지 내가 시도 할 수있는 다른 것에 대해 조언 할 수 있습니까?



3
또한 시작 ';'을 제거하여 해당 행의 주석을 해제했는지 확인하십시오. curl.cainfo = "C : \ xampp \ php \ cacert.pem"이어야합니다.; curl.cainfo = "C : \ xampp \ php \ cacert.pem"
Jon Tan

HTTPS over HTTP를 사용하면이 오류가 발생합니까?
javiniar.leonard

답변:


366

마침내 이것을 작동 시켰습니다!

  1. 인증서 번들을 다운로드하십시오 .

  2. 어딘가에 넣으십시오. 제 경우에는 c:\wamp\디렉토리 였습니다 (Wamp 64 비트를 사용하는 경우 c:\wamp64\).

  3. mod_sslApache와 php_openssl.dllin에서 활성화하십시오 php.ini( ;처음 에 제거 하여 주석을 해제하십시오 ). 그러나 내 문제는 두 개의 php.ini파일이 있고 두 파일 모두 에서이 작업을 수행해야한다는 것입니다. 하나는 WAMP 작업 표시 줄 아이콘에서 얻은 것이고 다른 하나는 내 경우에는C:\wamp\bin\php\php5.5.12\

  4. php.ini파일 모두에서 인증서에 다음 줄을 추가 하십시오.

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
  5. Wamp 서비스를 다시 시작하십시오.


3
내 경우에는 c : \ xamp \ 디렉토리와 Windows 7이었으며이 솔루션은 완벽하게 작동합니다. 감사합니다.
Manu RS

1
최신 인증서 번들은 원래 curl 사이트 curl.haxx.se/docs/caextract.html
Paul

1
내 경우에는 줄 ;의 시작 부분에 주석이 있다는 것을 깨닫기까지 몇 시간이 걸렸습니다. 그래서 나 같은 noobs에 대한 하나의 요구는 제거 할 ;뿐만 아니라
abhyudayasrinet

1
@SurajNeupane 확실하지 않습니다, 나는 이것을 다시 가져 오는 데 많은 시간을 보냈습니다. 나는 Homestead와 같은 가상 머신을 사용하며 이것을 처리 할 필요가 없습니다. 이 특정 사건이었다
믈라덴 Janjetovic

2
이것이 핵심입니다But be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\
AA

127

면책 조항 :이 코드는 서버를 안전하지 않게 만듭니다.

줄 번호 65 뒤에 Mandrill.php 파일에서 $ this-> ch = curl_init ();

다음 두 줄을 추가하십시오.

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

이것은 내 문제를 해결하고 localhost를 사용하여 전자 메일을 보냈지 만 라이브 버전 라이브에서는 사용하지 않는 것이 좋습니다. 라이브 서버에서 코드는이 코드없이 작동해야합니다.


1
이 우회없이 개발자 환경을 작동시킬 수있는 방법이 있습니까?
Dor Dadush

4
나를 위해, 그냥 일 CURLOPT_SSL_VERIFYPEER하기로 설정 false했습니다.
Francisco Corrales Morales

29
기술적으로는 정확하지만 SSL을 비활성화하는 것은 좋지 않습니다. localhost에서도 다른 답변에서 언급 한대로 인증서를 올바르게로드하는 것이 좋습니다.
척추

기술적으로는 정확하지만 SSL을 비활성화하는 것은 좋지 않습니다. 다른 방식으로 일하는 것에 대한 저항력이 강하더라도 적절하지 않은 sys-admin 방식으로 일을하는 것보다 실직하는 것이 좋습니다. @Spinal

45

감사합니다 @Mladen Janjetovic,

귀하의 제안은 ampps가 설치된 Mac에서 저에게 효과적이었습니다.

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

에: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

그리고 php.ini그 경로로 업데이트 하고 Apache를 다시 시작했습니다.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

그리고 Windows AMPPS 설치에서 동일한 설정을 적용했으며 완벽하게 작동했습니다.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

: amp과 동일합니다.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

localhost에 SAN을 사용하여 새 SSL 인증서를 생성하려는 경우이 게시물의 단계가 도움 되었습니다 Centos 7 / Vagrant / Chrome Browser.


18

당신이 볼 때 http://curl.haxx.se/docs/caextract.html의 페이지를, 당신은 섹션이라는 큰 글자에서 알 수 있습니다 :

RSA-1024 제거

이를 읽고 'RSA-1024'인증서가 포함 된 인증서 버전을 다운로드하십시오. https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

그것들은 Mandrill과 함께 작동합니다.

SSL을 비활성화하는 것은 나쁜 생각입니다.


1
이로 인해 하루 종일 어려움을 겪고있는 AWS / Guzzle / cURL 문제가 해결되었습니다. 감사합니다!
voidstate

@voidstate 나는 이것이 오래되었다는 것을 알고 있지만이 [ 'verify'=> false]를 사용하여 guzzle에서 우회 할 수도 있습니다. ssl / curl / guzzle에 대한 전체 문서를 보려면 여기를 방문하십시오. guzzle.readthedocs.org/en/latest/…
John

@ John하지만 SSL 확인을 사용하지 않도록 설정합니다. 원하는 것이 아닙니다. 그래서 그렇게하지 않는 것이 좋습니다.
Arturo Alvarado

1
Windows의 경우 서버에 파일을 저장 한 후 (예 : C : \ curl \ curl-ca-bundle.crt) php.ini에 다음을 추가하십시오 : [curl] curl.cainfo = " C : /curl/curl-ca-bundle.crt "[openssl] openssl.cafile ="C : /curl/curl-ca-bundle.crt "
voidstate

나는 서버가 오랫동안 변화하더라도 완벽하게 작동 한 후에 이것을 보냈지 만 여기서 무슨 일이 일어나고 있는지 정확히 이해하는 데 어려움을 겪고 있습니다. curl 또는 openssl이 업데이트되어 가지고 있습니까? ca 번들이 mailchimp와 호환되지 않는 것으로 변경 되었습니까?
Sammaye

11

위의 단계는 도움이되었지만 Windows 8에서는 효과가 없었습니다. 나는 상관 관계를 모르지만 아래 단계는 효과적이었습니다. 기본적으로 cacert.pem 파일이 변경되었습니다. 이것이 누군가를 돕기를 바랍니다.

  • http://curl.haxx.se/docs/caextract.html 에서 cacert.pem 파일을 다운로드하십시오.
  • PHP 설치 폴더에 파일을 저장하십시오. (예 : xampp를 사용하는 경우 – c : \ Installation_Dir \ xampp \ php \ cacert.pem에 저장하십시오).
  • php.ini 파일을 열고 다음 줄을 추가하십시오 :
  • curl.cainfo =”C : \ Installation_Dir \ xampp \ php \ cacert.pem”openssl.cafile =”C : \ Installation_Dir \ xampp \ php \ cacert.pem”
  • Apache 서버를 다시 시작하면 문제가 해결됩니다 (필요에 따라 서비스를 중지하고 시작하십시오).

11

curl을 호출하는 데 필요한 인증이없는 새로운 솔루션을 발견하면 두 줄 코드 만 추가하십시오.

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

9
이것이 작동 할 수도 있지만 전혀 권장되지 않습니다. 기본적으로 모든 인증서를 신뢰한다고 말하고 있습니다. 잊어 버린 코드 가이 변경으로 프로덕션에 적용되면 가능한 공격을 위해 응용 프로그램을 엽니 다. 포인트 PHP를 추가하십시오.
user919426

그것은 컬 개념이므로, curl을 사용할 때마다 위 코드를 추가하십시오
Manish sharma

8

php.ini에 액세스 할 수 없다면 이 코드를 추가하면 $ch = curl_init();나에게 효과적입니다.

$certificate_location = "C:\Program Files (x86)\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly (may need to be absolute)
curl_setopt($ch, CURLOPT_CAINFO, $certificate_location);
curl_setopt($ch, CURLOPT_CAPATH, $certificate_location);

그런 다음 ca-bundle.crt 를 다운로드 하여에 지정한 위치에 저장하면됩니다 $certificate_location.


3

이 문제에 대한 매우 간단한 해결책이 있습니다. 인증서 파일없이이 작업을 수행 할 수 있습니다.

에 이동 Laravel 루트 폴더 -> 자동 판매기 -> guzzlehttp -> 폭식 -> SRC

열린 Client.php

$ defaults Array를 찾으십시오. 이런 식으로 ..

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

이제 주요 작업은 확인 키의 값을 변경하는 것입니다 .

'verify'          => false,

따라서이 후 CURL 요청에 대한 SSL 인증서를 확인하지 않습니다 ...이 솔루션은 저에게 효과적입니다. 많은 연구 끝에이 솔루션을 찾았습니다 ...


2

서버 배포에 대한 위의 답변을 자세히 설명합니다.

$hostname = gethostname();
if($hostname=="mydevpc")
{
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}

배포시 서버를 손상시키지 않으면 서 개발 환경을위한 트릭을 수행해야합니다.


다른 환경에서 코드의 다른 부분을 실행하는 것은 좋은 개념처럼 들리지 않습니다. 디버깅이 더 어려워집니다.
Nico Haase

2

나는 이것을 시도했다.

열다

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

그리고 이것을 바꾸십시오

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

이에

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;

0

AppVeyor에서 앱을 빌드하는 동안 동일한 문제가 발생했습니다.

  • 다운로드 https://curl.haxx.se/ca/cacert.pem을c:\php
  • openssl 사용 echo extension=php_openssl.dll >> c:\php\php.ini
  • 인증서 찾기echo curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

0

위의 해결 방법 중 어느 것도 작동하지 않으면 XAMPP 설치를 최신 버전으로 업데이트하십시오.

PHP 5.5.11로 XAMPP를 실행하고 있는데 동일한 코드가 작동하지 않고 PHP 5.6.28을 사용하여 XAMPP로 업그레이드했으며 위의 솔루션이 작동했습니다.

또한 PHP 업데이트 만 작동하지 않았습니다. 해당 XAMPP 버전의 아파치 및 PHP 설정 조합처럼 보입니다.

그것이 누군가를 돕기를 바랍니다.


0

다음과 같은 오류가 발생했습니다.

failed loading cafile stream: `C:\xamppPhp\apache\bin\curl-ca-bundle.crt`

Windows 컴퓨터를 사용하고 있습니다. 그래서 아래 단계를 수행했습니다.

1. I have downloaded .pem file from " https://curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

그것이 누군가를 도울 수 있기를 바랍니다.


0

로컬 시스템 에서는 그렇지 않지만 라이브 서버에서는 이와 같은 문제에 직면했습니다 . 또한이 페이지에서 이전에 다른 솔루션을 언급했지만 localhost 에서 작동하지 않았으므로 localhost-WAMP Server 에서 작동하는 새로운 솔루션을 찾으십시오 .

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

때때로 시스템이 드라이브에서 cacert.pem 을 찾을 수 없습니다 . CURL 을 사용할 코드에서 이것을 정의 할 수 있습니다.

OPEN-SSL 라이브러리 활성 및 기타 사항과 같은 모든 조건을 충족하고 있습니다.

CURL 코드를 확인하십시오 .

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

그러나이 솔루션은 라이브 서버에서 작동하지 않을 수 있습니다. cacert.pem 의 절대 경로로 인해


0

이 문제에 대한 적절한 해결책이 있습니다.이 문제의 근본 원인을 이해하고 시도해보십시오. 이 문제는 시스템의 인증서 저장소에서 루트 인증서를 사용하여 원격 서버 ssl을 확인할 수 없거나 원격 ssl이 체인 인증서와 함께 설치되지 않은 경우에 발생합니다. 루트 ssh 액세스 권한이있는 Linux 시스템이있는 경우이 경우 아래 명령으로 인증서 저장소를 업데이트 할 수 있습니다.

update-ca-certificates

여전히 작동하지 않으면 인증서 저장소에 원격 서버의 루트 및 임시 인증서를 추가해야합니다. 루트 및 중간 인증서를 다운로드하여 / usr / local / share / ca-certificates 디렉토리에 추가 한 다음 command를 실행할 수 update-ca-certificates있습니다. 이것은 트릭을해야합니다. 마찬가지로 Windows의 경우 루트 및 중간 인증서를 추가하는 방법을 검색 할 수 있습니다.

이 문제를 해결할 수있는 다른 방법은 원격 서버 팀에 ssl 인증서를 도메인 루트 인증서, 중간 인증서 및 루트 인증서의 번들로 추가하도록 요청하는 것입니다.


-4

총구 들어 당신은 이것을 시도 할 수 있습니다 :

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

구글 / 구글 3. *에서 테스트


1
200 세 이상의 공감대가 허용 된 답변이있는 3 년 된 질문에 대한 답이 있습니까?
treyBake

내 대답은 위의 것보다 간단합니다. 몇 달 동안 10 개의
투표

1
나는 OP에서 괴로움에 대한 언급을 보지 않고 그것을 의심합니다 ... 그래서 관련이 없습니다. 누군가가 JavaScript 문제에 대한 jQuery 솔루션을 제공 할 때도 마찬가지입니다. 관련이 없습니다.
treyBake

여기서 사용되지 않는다는 사실은 변하지 않습니다. 가장 많이 사용되는 서버 운영 체제이기 때문에 Windows 사용자에게 Linux 솔루션을 제안 하시겠습니까? 모든 사람이 Guzzle을 사용하고 싶지는 않지만 개인적으로 PHP를 사용한 지 몇 년 동안 한 번도 사용하지 않았습니다. 나에게 HTTP 요청은 패키지를 필요로하는 것이 그렇게 어렵지 않습니다.
treyBake

1
완전히 인식-그것은 단지 필요하지 않습니다. 컬에 대한 문서를 읽고 모든 설명이 필요합니다. 똑똑한 것이 아니라 질문에 올바르게 대답하는 것입니다
treyBake
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.