[php] cURL 오류 60 : SSL 인증서 : 로컬 발급자 인증서를 가져올 수 없습니다

로컬 개발 환경에서 WAMP를 사용하고 신용 카드를 청구하려고하지만 오류 메시지가 나타납니다.

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

나는 구글에서 많은 것을 검색했으며 많은 사람들 이이 파일을 다운로드 할 것을 제안하고 있습니다 : cacert.pem , 어딘가에 넣고 내 php.ini에서 참조하십시오. 이것은 내 php.ini의 일부입니다.

curl.cainfo = "C:\Windows\cacert.pem"

그러나 서버를 여러 번 다시 시작하고 경로를 변경 한 후에도 동일한 오류 메시지가 나타납니다.

Apache Modules에서 WAMP를 사용하고 ssl_module을 활성화했습니다. 그리고 PGP 확장에서 php_curl을 활성화했습니다.

여전히 같은 오류 메시지입니다. 왜 그런 일이?

이제이 수정을 따르고 있습니다 : PHP CURL 오류 60 SSL 수정하는 방법

cURL 옵션에 다음 줄을 추가하는 것이 좋습니다.

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);

내 cURL에 옵션을 어디에 추가합니까? CLI가 “curl_setopt”명령을 찾지 못해 명령 행을 통하지 않는 것 같습니다.

편집하다

이것은 내가 실행중인 코드입니다.

public function chargeStripe()
{
    $stripe = new Stripe;
    $stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));

    $charge = $stripe->charges()->create([
        'amount'   => 2900,
        'customer' => Input::get('stripeEmail'),
        'currency' => 'EUR',
    ]);

    dd($charge);

    // echo $charge[Input::get('stripeToken')];


    return Redirect::route('step1');
}



답변

XAMPP를 사용하는 Windows에서 가정하는 작업 솔루션 :

XAMPP 서버

  1. 다른 환경과 유사
    • cacert.pem을 다운로드하여 압축을 풉니 다 (깨끗한 파일 형식 / 데이터).

https://curl.haxx.se/docs/caextract.html

  1. 다음 디렉토리에 넣으십시오.

C : \ xampp \ php \ extras \ ssl \ cacert.pem

  1. php.ini에서이 줄을이 섹션에 넣으십시오 ( “c : \ xampp \ php \ php.ini”) :
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
  1. 웹 서버 / 아파치를 다시 시작하십시오

  2. 문제 해결됨!

(참조 : https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )


답변

주의 Wamp / WordPress / windows 사용자. 나는 몇 시간 동안이 문제를 겪었으며 올바른 질문조차도 나를 위해 그것을하지 않았다. 왜냐하면 질문이 WAMP에 대한 것이더라도 WAMP 사용자가 아닌 XAMPP에 대한 질문에 대답했기 때문에 잘못된 php.ini 파일을 편집하고 있었기 때문입니다.

여기 내가 한 일이 있습니다.

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

안에 넣어 C:\wamp64\bin\php\your php version\extras\ssl

파일 mod_ssl.so이 내부에 있는지 확인하십시오C:\wamp64\bin\apache\apache(version)\modules

Apache 디렉토리 내부 mod_ssl에서 활성화httpd.confC:\wamp64\bin\apache\apache2.4.27\conf

사용 php_openssl.dll에서 php.ini. 내 문제는 두 개의 php.ini 파일이 있고 두 파일 모두 에서이 작업을 수행해야한다는 것입니다. 첫 번째는 WAMP 작업 표시 줄 아이콘 안에 있습니다.

여기에 이미지 설명을 입력하십시오

다른 하나는 C:\wamp64\bin\php\php(Version)

php.ini파일 의 위치를 찾고 줄을 찾아 다음 curl.cainfo =과 같은 경로를 지정하십시오

curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"

이제 파일을 저장하고 서버를 다시 시작하십시오.


답변

Guzzle과 함께 PHP 5.6을 사용하는 경우 Guzzle은 프로세스 ( ref )가 아니라 인증서에 대해 PHP 라이브러리 자동 감지를 사용하도록 전환했습니다 . PHP는 여기서 변경 사항을 설명합니다 .

PHP / Guzzle에서 인증서를 찾는 위치 찾기

다음을 사용하여 PHP가 찾고있는 곳을 덤프 할 수 있습니다.

 var_dump(openssl_get_cert_locations());

인증서 번들 얻기

OS X 테스트의 경우 homebrew를 사용하여 openssl을 설치 brew install openssl한 다음 openssl.cafile=/usr/local/etc/openssl/cert.pemphp.ini 또는 Zend 서버 설정 (OpenSSL 아래)에서 사용할 수 있습니다.

curl 웹 사이트의 curl / Mozilla에서 인증서 번들을 사용할 수도 있습니다. https://curl.haxx.se/docs/caextract.html

인증서가 어디에 있는지 PHP에 알리기

번들이 있으면 PHP가 이미 찾고있는 곳에 배치하거나 (위에서 찾은) openssl.cafilephp.ini에서 업데이트하십시오 . (일반적으로, /etc/php.ini또는 /etc/php/7.0/cli/php.ini또는 /etc/php/php.ini유닉스.)


답변

cartalyst / stripe 가 사용하는 Guzzle 은 다음을 수행하여 서버 인증서를 확인하기위한 적절한 인증서 아카이브를 찾습니다.

  1. openssl.cafilephp.ini 파일에 설정되어 있는지 확인하십시오 .
  2. curl.cainfophp.ini 파일에 설정되어 있는지 확인하십시오 .
  3. /etc/pki/tls/certs/ca-bundle.crt존재 하는지 확인 (Red Hat, CentOS, Fedora; ca-certificates 패키지에서 제공)
  4. /etc/ssl/certs/ca-certificates.crt존재 하는지 확인 (우분투, 데비안, ca 인증서 패키지에서 제공)
  5. /usr/local/share/certs/ca-root-nss.crt존재 하는지 확인 (FreeBSD; ca_root_nss 패키지에서 제공)
  6. 확인되는 경우 /usr/local/etc/openssl/cert.pem(OS X, 사제 의해 제공)
  7. C:\windows\system32\curl-ca-bundle.crt존재 하는지 확인 (Windows)
  8. C:\windows\curl-ca-bundle.crt존재 하는지 확인 (Windows)

간단한 테스트를 수행하여 처음 두 설정의 값을 올바르게 정의해야합니다.

echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";

또는 # 7 또는 # 8로 표시된 위치에 파일을 쓰십시오.


답변

php.ini를 변경할 수 없다면 다음과 같은 코드에서 cacert.pem 파일을 가리킬 수도 있습니다.

$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);


답변

내가 한 것은 var_dump(openssl_get_cert_locations()); die;PHP 스크립트에서 사용 했기 때문에 로컬 PHP가 사용하는 기본값에 대한 정보를 제공했습니다.

array (size=8)
  'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
  'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
  'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
  'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
  'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
  'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
  'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
  'ini_capath' => string '' (length=0)

알다시피, ini_cafile 또는 ini 옵션 curl.cainfo를 설정했습니다. 그러나 내 경우 curl은 존재하지 않는 “default_cert_file”을 사용하려고 시도합니다.

https://curl.haxx.se/ca/cacert.pem 에서 “default_cert_file”(c : /openssl-1.0.1c/ssl/cert.pem) 위치로 파일을 복사하여 가져올 수있었습니다. 일하다.

이것이 나를위한 유일한 해결책이었습니다.


답변

Guzzle (5) 스크립트가 SSL을 통해 호스트에 연결하려고 시도했을 때이 문제가 파란색으로 표시되지 않았습니다. 물론, Guzzle / Curl에서 VERIFY 옵션을 비활성화 할 수는 있지만 올바른 방법은 아닙니다.

나는 여기에 나열된 것과 비슷한 스레드로 모든 것을 시도한 다음 결국 openssl을 사용하여 터미널에 가서 연결하려는 도메인에 대해 테스트했습니다.

openssl s_client -connect example.com:443 

… 그리고 다음을 나타내는 처음 몇 줄을 받았습니다 :

CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1 

… 다른 목적지 (예 : google.com 등)를 시도 할 때 모든 것이 제대로 작동하는 동안

이것은 내가 연결하려고했던 도메인에 연락하도록 유도했으며 실제로 THEIR END에 문제가 발생했습니다. 문제가 해결되었고 스크립트가 다시 작동했습니다.

따라서 … 머리를 당기는 경우 openssl에 샷을주고 연결하려는 위치의 응답에 문제가 있는지 확인하십시오. 어쩌면 문제는 때때로 ‘현지’가 아닐 수도 있습니다.