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


232

로컬 개발 환경에서 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');
}

코드에 문제가 없다고 가정하면 방화벽 일 수 있습니다. 방화벽을 비활성화하여 테스트하십시오.
Waqar ul islam

did't 나는 당신이이 질문에 답을 준 여기에 ? :)
Limon Monte

@limonte는 가능하며 프로젝트를 전환해야했으며 새 프로젝트와 동일한 문제가있을 수 있습니다. 거즐 문제로 다시 전환되며 동일한 수정 사항 일 수 있습니다. brb
LoveAndHappiness

1
최신 버전의 스트라이프를 사용해 보셨습니까? certs와 관련이있는 커밋 메시지가 보인다
thelastshadow

1
@LoveAndHappiness이 문제에 대한 해결책을 얻었습니까? 스트라이프와 같은 오류가 발생했습니다. 해결책이 있으면 알려주세요.
Dev

답변:


515

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 )


6
이 메시지는 PHP 버전으로 인해 온 것입니다. PHP 5.5보다 높으면 PHP 5.6의 새로운 기능으로 인해이 오류가 발생합니다. cURL을 사용하는 경우 PHP 5.6 인증서를 확인하십시오.
UWU_SANDUN

9
답변 해주셔서 감사합니다! 공식 curl 페이지에서 cacert.pem을 사용하는 것이 좋습니다. curl.haxx.se/docs/caextract.html
dieBeiden

6
이 기능을 사용할 수없는 사람을 지적하고 싶었습니다. 슬래시를 사용하고 curl.cainfo = "C:/cacert.pem"컴퓨터를 다시 시작해야 작동했습니다. 웹 서버를 다시 시작하는 것만으로는 충분하지 않습니다. 잘만되면 도움이됩니다.]
space_food_

1
및 주석을 잊지 마세요 curl.cainfo(마른 세수)
에드먼드 Sulzanok

매력처럼 일했다! 감사합니다
Jack

55

주의 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"

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


아파치를 SAPI 클라이언트로 사용하는 경우 아파치 디렉토리에서 하나를 수정하거나 클라이언트에서 하나를 수정하십시오. php.exe를 SAPI로 사용하려는 경우 dir.
Fabien Haddadi 2016 년

3
"둘 다이 작업을 수행해야합니다"가 핵심 참고 사항입니다. 감사합니다
Jaroslav Klimčík 2016 년

1
"guzzlehttp / guzzle": "^ 6.3"과 함께 Laravel 5.5에서 작동합니다. server 프 서버 3.1.3. Php 7.1 *
Deepesh Thapa

이 일했다. 감사합니다
user4906240

WAMP에 대한 응답을 주셔서 감사합니다
자일리톨

46

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유닉스.)


3
예. 너무 많은 사람들이 여러 버전 번호로 다운 그레이드하는 명백한 잘못된 접근 방식을 제안한 후 이는 올바른 접근 방식으로 나타납니다. 나는 cafile에 대한 다른 사람들의 조언을 따랐지만 왜 여전히로드되지 않는지를 테스트 할 수단이 없었습니다. 이 openssl_get_cert_locations () 함수는 실제로 내 문제를 식별하는 작업을 수행했습니다. 감사!
웹 및 흐름

1
제공해 주셔서 감사합니다 openssl_get_cert_locations. 디버깅이 훨씬 쉬워졌습니다. WAMP는 콘솔 PHP와 아파치 PHP에 다른 ini 파일을 사용하는 것처럼 보입니다. 필자의 경우 openssl.cafile="c:/_/cacert.pem"콘솔 기반 PHP 를 추가해야했습니다 . 마지막으로 아파치를 통해 curl.cainfo="c:/_/cacert.pem"사용할 때 작동시켜야했습니다.
psycho brm

16

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로 표시된 위치에 파일을 쓰십시오.


13

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

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

8

내가 한 것은 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) 위치로 파일을 복사하여 가져올 수있었습니다. 일하다.

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


나는 비슷한 문제가 있고 내 위치는 c : / usr / local / ssl / cert.pem과 같지만이 위치는 존재하지 않습니다. 무엇을 할 수 있습니까, 더 나아가 동일한 프로젝트가 맥 컴퓨터의 내 동료가 사용합니다. 그 이유는 .ini 파일에 인증서 위치를 추가하는 다른 모든 것을 시도했지만 작동하지 않습니다. 솔루션이 의미가 있지만 해당 위치를 변경할 수 없으며 인증서를 넣을 수 없으므로 솔루션이 작동하는 것처럼 보입니다. 존재하지 않는 위치에 있습니다.
AbdulMueed

폴더를 만들고 지정된 경로에 인증서를 넣을 수 있습니까?
George Donev

7

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에 샷을주고 연결하려는 위치의 응답에 문제가 있는지 확인하십시오. 어쩌면 문제는 때때로 '현지'가 아닐 수도 있습니다.


6

나는 나를 위해 일한 해결책을 찾았다. 최신 총구에서 버전 ~ 4.0으로 다운 그레이드했습니다.

composer.json에서 "guzzlehttp / guzzle"을 추가하십시오 : "~ 4.0"

누군가에게 도움이되기를 바랍니다.


또한 버전 5/6 기능을 사용하지 못하게됩니다. 대신 param 배열 (요청 메소드의 3 번째 매개 변수)에서 verify를 false로 설정하십시오. $ client-> request ( 'GET', '/', [ 'verify'=> false]);
S ..

3

php.ini창 탐색기 에서 파일을 직접 열어야합니다 . (내 경우 :) C:\DevPrograms\wamp64\bin\php\php5.6.25.

php.ini시스템 트레이의 Wamp / Xamp 아이콘 메뉴에서 바로 가기를 사용하지 마십시오 . 이 경우이 바로 가기가 작동하지 않습니다.

그런 다음 편집하십시오 php.ini.

curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem" 

openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"

저장 한 후에 php.ini는 Wamp 아이콘에서 "모든 서비스를 다시 시작"하거나 CMD를 닫거나 다시 열 필요가 없습니다.


2

당신이 시도 ..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

신뢰할 수있는 소스를 사용하는 경우 SSL 인증서를 확인할 필요가 없습니다.


2

나는이 문제를 알아 내기 위해 너무 많은 시간을 보냈다.

PHP 버전 5.5를 사용했고 5.6으로 업그레이드해야했습니다.

<5.6 버전에서는 Guzzle이 자체 cacert.pem 파일을 사용하지만, 상위 버전의 PHP에서는 시스템의 cacert.pem 파일을 사용합니다.

나는 또한 https://curl.haxx.se/docs/caextract.html 에서 파일을 다운로드 하여 php.ini에 설정했습니다.

답변은 Guzzles StreamHandler.php 파일 https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437에 있습니다.

        // PHP 5.6 or greater will find the system cert by default. When
        // < 5.6, use the Guzzle bundled cacert.

2

모든 답변이 정확합니다. 그러나 가장 중요한 것은 올바른 php.ini 파일을 찾아야 한다는 것 입니다. cmd "php --ini" 에서이 명령을 확인 하십시오. 올바른 php.ini 파일을 찾기위한 정답은 아닙니다 .

편집하면

curl.cainfo ="PATH/cacert.pem"

확인

var_dump(openssl_get_cert_locations()); 

curl.cainfo에 값이 있어야합니다. 그렇지 않다면 php.ini 파일이 맞지 않습니다.

* wamp / bin 또는 xxamp / bin 또는 사용하는 서버에서 * .ini를 검색하여 하나씩 변경하고 확인하는 것이 좋습니다. *


1

방금 guzzlehttp/guzzlecomposer 패키지 를 사용하는 Laravel 4 PHP 프레임 워크에서 이와 동일한 문제가 발생했습니다 . 어떤 이유로 mailgun의 SSL 인증서가 갑자기 유효성 검사를 중지했으며 동일한 "오류 60"메시지가 표시됩니다.

나와 같이에 액세스 할 수없는 공유 호스팅을 사용하는 php.ini경우 다른 솔루션을 사용할 수 없습니다. 어쨌든, Guzzle은 다음과 같은 클라이언트 초기화 코드를 가지고 php.ini있습니다.

// vendor/guzzlehttp/guzzle/src/Client.php
    $settings = [
        'allow_redirects' => true,
        'exceptions'      => true,
        'decode_content'  => true,
        'verify'          => __DIR__ . '/cacert.pem'
    ];

여기서 Guzzle은 cURL의 환경에서 제공하는 파일을 사용하는 대신 자체 내부 cacert.pem 파일을 강제로 사용 합니다 . 이 줄을 변경하면 (최소한 Linux에서는) cuzz의 기본 SSL 확인 논리를 사용하도록 Guzzle을 구성하고 내 문제를 해결했습니다.

        'verify'          => true

falseSSL 연결의 보안에 신경 쓰지 않는다면 이것을 설정할 수도 있지만 좋은 해결책은 아닙니다.

파일은 vendor무단 변경되지 않으므로 사용시 Guzzle 클라이언트구성 하는 것이 더 나은 솔루션 이지만 Laravel 4에서는 너무 어려웠습니다.

이것이 다른 사람에게 몇 시간의 디버깅을 구하기를 바랍니다 ...


1

이것은 극단적 인 경우 일 수 있지만 내 경우에는 문제가 클라이언트 conf (이미 curl.cainfo구성되어 있음 php.ini)가 아니라 원격 서버가 올바르게 구성되지 않은 것입니다.

체인에 중간 인증서 를 보내지 않았습니다 . Chrome을 사용하여 사이트를 탐색하는 동안 오류가 발생하지 않았지만 PHP를 사용하여 다음 오류가 발생했습니다.

컬 오류 60

원격 웹 서버 구성에 중간 인증서 를 포함시킨 후에 작동했습니다.

이 사이트를 사용하여 서버의 SSL 구성을 확인할 수 있습니다.

https://whatsmychaincert.com/


1

실행할 때 'var_dump(php_ini_loaded_file());' 내 페이지 에서이 출력을 얻습니다. 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'

PHP가 내 인증서 파일을로드하도록하려면이 경로에서 php.ini를 편집하고 https://curl.haxx.se/docs/caextract.html 에서 인증서 파일을 다운로드하고 배치 한 위치를 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' 추가해야했습니다 openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem".

drupal 8, wamp 및 php7.2.4를 사용하는 Windows 10에 있습니다.


0

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

update-ca-certificates

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

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


-1

Windows를 사용함에 따라 경로 구분 기호는 '\'(Linux의 경우 '/')입니다. 상수를 사용해보십시오 DIRECTORY_SEPARATOR. 코드가 더 이식성이 뛰어납니다.

시험:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');

편집 : 전체 경로를 작성하십시오. 상대 경로에 문제가 있습니다 (아마도 컬이 다른 기본 디렉토리에서 실행됩니까?)


1
특정 Stripe 라이브러리를 사용할 때 실제 cURL 설정을 제어 할 수 없으므로 차이가 없습니다.
Ja͢ck

-1

WAMP를 사용하는 경우 Apache의 php.ini에 인증서 줄을 추가해야합니다 (기본 php.ini 파일 외에).

[curl]
curl.cainfo = C:\your_location\cacert.pem

PHP5.3 이상에서 작동


예! 아파치 및 PHP 버전 php.ini 파일을 모두 편집하도록주의하십시오. WAMP 사용자의 경우이 답변은 내 문제를 해결할 수있는 유일한 방법입니다 : stackoverflow.com/questions/28858351/…
MavBzh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.