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.