복붙노트

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

PHP

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

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

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

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

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

나는 Apache Module에서 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);

내 서재에 옵션을 추가하려면 어떻게해야합니까? 내 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');
}

해결법

  1. ==============================

    1.작업 해결책 :

    작업 해결책 :

    다른 환경과 비슷하다. - cacert.pem 다운로드 및 추출 (깨끗한 파일 형식 / 데이터)

    문제 해결됨!

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

  2. ==============================

    2.Guzzle에서 PHP 5.6을 사용하는 경우 Guzzle는 PHP 라이브러리를 사용하여 프로세스 (ref)가 아닌 인증서를 자동으로 검색하도록 전환했습니다. PHP는 여기에서 변경 사항을 설명합니다.

    Guzzle에서 PHP 5.6을 사용하는 경우 Guzzle는 PHP 라이브러리를 사용하여 프로세스 (ref)가 아닌 인증서를 자동으로 검색하도록 전환했습니다. PHP는 여기에서 변경 사항을 설명합니다.

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

     var_dump(openssl_get_cert_locations());
    

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

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

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

  3. ==============================

    3.주의 Wamp / Wordpress / windows 사용자. 나는 몇 시간 동안이 문제를 가지고 있었고 정답조차도 나에게 해 주었다. WAMP에 대한 질문 이었지만 질문이 XAMPP에 응답 되었기 때문에 잘못된 php.ini 파일을 편집했기 때문이다.

    주의 Wamp / Wordpress / windows 사용자. 나는 몇 시간 동안이 문제를 가지고 있었고 정답조차도 나에게 해 주었다. WAMP에 대한 질문 이었지만 질문이 XAMPP에 응답 되었기 때문에 잘못된 php.ini 파일을 편집했기 때문이다.

    여기 내가 한 짓이야.

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

    C : \ wamp64 \ bin \ php \ php version \ extras \ ssl 안에 넣으십시오.

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

    Apache 디렉토리 C : \ wamp64 \ bin \ apache \ apache2.4.27 \ conf 내부의 httpd.conf에서 mod_ssl을 활성화하십시오.

    php.ini에서 php_openssl.dll을 활성화하십시오. 내 문제는 두 개의 php.ini 파일이 있다는 것을 알고 있어야하며 두 파일 모두에서이 작업을 수행해야합니다. 첫 번째는 WAMP 작업 표시 줄 아이콘 안에 있습니다.

    다른 하나는 C : \ wamp64 \ bin \ php \ php (Version)에 있습니다.

    두 php.ini 파일의 위치를 ​​찾고 curl.cainfo = 줄을 찾고이 경로를 지정하십시오

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

    이제 파일을 저장하고 서버를 다시 시작하면 좋을 것입니다.

  4. ==============================

    4.Cartalyst / 스트라이프에서 사용하는 Guzzle은 서버 인증서를 확인하기 위해 적절한 인증서 아카이브를 찾기 위해 다음을 수행합니다.

    Cartalyst / 스트라이프에서 사용하는 Guzzle은 서버 인증서를 확인하기 위해 적절한 인증서 아카이브를 찾기 위해 다음을 수행합니다.

    간단한 테스트를 수행하여 처음 두 설정의 값이 올바르게 정의되었는지 확인해야합니다.

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

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

  5. ==============================

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

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

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

    6.나에게 도움이되는 해결책을 찾았다. 나는 최신 그릴에서 버전 4.0으로 다운 그레이드했고 효과가 있었다.

    나에게 도움이되는 해결책을 찾았다. 나는 최신 그릴에서 버전 4.0으로 다운 그레이드했고 효과가 있었다.

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

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

  7. ==============================

    7.내가 한 일은 var_dump (openssl_get_cert_locations ()); 주사위; 내 로컬 PHP가 사용하는 기본값에 대한 정보를 준 모든 PHP 스크립트에서 :

    내가 한 일은 var_dump (openssl_get_cert_locations ()); 주사위; 내 로컬 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를 설정했습니다. 하지만 필자의 경우, 컬은 존재하지 않는 "default_cert_file"을 사용하려고합니다.

    나는 https://curl.haxx.se/ca/cacert.pem에서 "default_cert_file"(c : /openssl-1.0.1c/ssl/cert.pem)의 위치에 파일을 복사했고 그것을 얻을 수 있었다. 일하다.

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

  8. ==============================

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

    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 등)를 시도 할 때 모든 것이 잘 작동하는 동안

    이것은 내가 연결하려고 시도해 왔던 도메인에 연락하게 만들었고, 실제로 그들은 끝까지 삐죽 삐리는 문제가있었습니다. 해결되었고 스크립트는 다시 작동했습니다.

    그러니 ... 당신이 머리카락을 꺼내고 있다면, openssl을 발사하고 연결하려는 위치의 응답이 있는지 확인하십시오. 어쩌면 문제는 때로는 '로컬'이 아닐 수도 있습니다.

  9. ==============================

    9.너 해봤 어 ..

    너 해봤 어 ..

    curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);
    

    틀림없이 신뢰할 수있는 소스를 사용하고 있다면 SSL 인증서를 확인할 필요가 없습니다.

  10. ==============================

    10.난 그냥 guzzlehttp / guzz 작곡가 패키지를 사용하여 Laravel 4 PHP 프레임 워크와 같은 문제가 발생했습니다. 어떤 이유로, mailgun에 대한 SSL 인증서가 갑자기 유효성 검사를 중단하고 동일한 "오류 60"메시지가 나타납니다.

    난 그냥 guzzlehttp / guzz 작곡가 패키지를 사용하여 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에서는) cURL의 기본 SSL 확인 논리를 사용하도록 Guzzle을 구성하고 내 문제를 해결했습니다.

            'verify'          => true
    

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

    공급 업체의 파일이 변조되지 않으므로 더 나은 솔루션은 Guzzle 클라이언트를 사용법에 맞게 구성하는 것이지만 Laravel 4에서는 너무 어렵습니다.

    희망이 다른 사람이 디버깅 몇 시간을 절약 할 수 있습니다 ...

  11. ==============================

    11.이것은 가장자리의 경우일지도 모르지만 제 경우에는 문제가 클라이언트의 conf (php.ini에서 이미 curl.cainfo를 구성했습니다)가 아니라 원격 서버가 제대로 구성되지 않았습니다.

    이것은 가장자리의 경우일지도 모르지만 제 경우에는 문제가 클라이언트의 conf (php.ini에서 이미 curl.cainfo를 구성했습니다)가 아니라 원격 서버가 제대로 구성되지 않았습니다.

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

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

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

    https://whatsmychaincert.com/

  12. ==============================

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

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

    나는 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에서 찾았습니다.

  13. ==============================

    13.창 탐색기로 php.ini 파일을 직접 열어야합니다. (필자의 경우 : C : \ DevPrograms \ wamp64 \ bin \ php \ php5.6.25).

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

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

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

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

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

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

  14. ==============================

    14.내가 'var_dump (php_ini_loaded_file ());'을 실행할 때 내 페이지에이 결과가 표시됩니다. 'C : \ Development \ bin \ apache \ apache2.4.33 \ bin \ php.ini'(길이 = 50) '

    내가 'var_dump (php_ini_loaded_file ());'을 실행할 때 내 페이지에이 결과가 표시됩니다. 'C : \ Development \ bin \ apache \ apache2.4.33 \ bin \ php.ini'(길이 = 50) '

    php가 내 cert 파일을로드하도록하려면 'C : \ Development \ bin \ apache \ apache2.4.33 \ bin \ php.ini'경로에서 php.ini 파일을 편집해야합니다. openssl.cafile = "C : /Development/bin/php/php7.2.4/extras/ssl/cacert.pem"을 추가하여 https://curl.haxx.se/docs/에서 내 cert 파일을 다운로드하고 배치하십시오. caextract.html

    오전 10시, drupal 8, wamp 및 php7.2.4 사용

  15. ==============================

    15.Windows를 사용함에 따라 경로 구분 기호는 '\'(Linux에서는 '/')라고 생각합니다. DIRECTORY_SEPARATOR 상수를 사용해보십시오. 코드가 더 이식성이 있습니다.

    Windows를 사용함에 따라 경로 구분 기호는 '\'(Linux에서는 '/')라고 생각합니다. DIRECTORY_SEPARATOR 상수를 사용해보십시오. 코드가 더 이식성이 있습니다.

    시험:

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

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

  16. ==============================

    16.WAMP를 사용한다면 아파치 용 php.ini (기본 php.ini 파일 외에)에 인증서 라인을 추가해야합니다 :

    WAMP를 사용한다면 아파치 용 php.ini (기본 php.ini 파일 외에)에 인증서 라인을 추가해야합니다 :

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

    php5.3 +에서 작동합니다.

  17. from https://stackoverflow.com/questions/29822686/curl-error-60-ssl-certificate-unable-to-get-local-issuer-certificate by cc-by-sa and MIT license