source

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

manysource 2022. 11. 23. 20:22

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

Stripe를 사용하여 API 요청을 전송하려고 하는데 다음 오류 메시지가 나타납니다.

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

실행 중인 코드는 다음과 같습니다.

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',
    ]);

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

구글에서 많이 검색했더니 많은 분들이 cacert.pem 파일을 다운받으라고 하시네요.어딘가에 저장해서 제 php.ini에서 참조하세요.이것은 제 php.ini의 부분입니다.

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

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

하게 하고 있습니다. php_curl을 유효하게 하고 .php.ini.

수정도 시도해 보았습니다.PHP CURL 오류 60 SSL 수정 방법

즉, 다음 행을 cURL 옵션에 추가할 것을 권장합니다.

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

curl_setopt 명령어를 CLI에서 찾을 수 없기 때문에 curl_setopt 명령어에서는 옵션을 추가할 수 없습니다.

이 문제의 해결 방법:

  • https://curl.se/docs/caextract.html의 지시에 따라 cacert.pem을 다운로드하여 압축을 풉니다.

  • XAMPP 는 XAMPP를 사용할 수 C:\xampp\php\extras\ssl\cacert.pem)

  • 이 를 php.ini에 .[curl]섹션(에 ))[openssl]섹션도 권장됩니다).

[curl]
curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"

[openssl]
openssl.cafile = "C:\xampp\php\extras\ssl\cacert.pem"
  • 웹 서버(예: Apache) 및 PHP FPM 서버를 재시작합니다(해당하는 경우).

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

Wamp/Wordpress/Windows 사용자에게 알립니다.몇 시간 동안 이 문제가 있었지만, 정답조차 나를 위한 것이 아니었다.왜냐하면 나는 잘못된 php.ini 파일을 편집하고 있었기 때문이다.왜냐하면 그 질문은 WAMP 사용자를 위한 것이 아니라 XAMPP에 대한 것이었기 때문이다.

제가 한 일은 다음과 같습니다.

  1. 증명서 번들을 다운로드합니다.

  2. C:\wamp64\bin\php\your php version\extras\ssl

  3. ★★의 C:\wamp64\bin\apache\apache(version)\modules 「파일을 확인해 mod_ssl.so

  4. 디렉토리 Apache C:\wamp64\bin\apache\apache2.4.27\conf, enable, enable, enabledamod_sslhttpd.conf

  5. 능능 enable enable enable enable를 유효하게 php_openssl.dllphp.ini제 문제는 두 개의 php.ini 파일이 있는데 두 파일 모두에서 이 작업을 수행해야 한다는 것입니다.WAMP를 사용하다

    여기에 이미지 설명 입력

    나머지 는 '보다 낫다'에 요.C:\wamp64\bin\php\php(Version)

    가지 .php.ini the " " " " " " " " " 。curl.cainfo = .curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"

  6. 이제 파일을 저장하고 서버를 재시작하면 바로 시작할 수 있습니다.

만약 당신이 PHP 5.6을 Guzzle과 함께 사용하고 있다면, Guzzle은 PHP 라이브러리의 프로세스(ref)가 아닌 증명서에 대한 자동검출을 사용하는 것으로 전환했습니다.PHP는 여기에 변경 내용을 정리합니다.

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

다음 PHP 명령을 사용하여 PHP 검색 위치를 덤프할 수 있습니다.

 var_dump(openssl_get_cert_locations());

증명서 번들 취득

X OS X "homebrew" "openssl" 을 설치할 수 .brew install openssl에 런음음음 and를 사용하다openssl.cafile=/usr/local/etc/openssl/cert.pemini 설정(OpenSSL 아래).php. Zend Server 설정(OpenSSL 아으으으으으으 in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in in ( OpenSSL ) 。

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

PHP에 인증서 위치 알림

있는 되었습니다), "PHP"를 합니다.openssl.cafile (php.ini. (일본어)/etc/php.ini ★★★★★★★★★★★★★★★★★」/etc/php/7.0/cli/php.ini ★★★★★★★★★★★★★★★★★」/etc/php/php.ini를 참조해 주세요

CARTYST/Stripe에서 사용되는 Guzzle은 다음 작업을 수행하여 서버 증명서를 검사하는 적절한 증명서 아카이브를 찾습니다.

  1. openssl.cafile fileset.ini로 .
  2. curl.cainfo fileset.ini로 .
  3. /etc/pki/tls/certs/ca-bundle.crt Hat,패키지에 제공됨(Red Hat, CentOS, Fedora, CA)
  4. /etc/ssl/certs/ca-certificates.crt패키지에서 )(Ubuntu, Debian, ca-certificates " " )
  5. /usr/local/share/certs/ca-root-nss.crt(FreeB))SD, ca_root_nss " )
  6. /usr/local/etc/openssl/cert.pem X,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);

한은 가가한 what what what what를 사용한 것이다.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 option curl.cainfo를 설정했습니다.그러나 제 경우 curl은 존재하지 않는 "default_cert_file"을 사용하려고 합니다.

파일을 https://curl.haxx.se/ca/cacert.pem에서 "default_cert_file" 위치(c:/sl-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 등)를 시험했을 때는 모든 것이 정상적으로 동작했습니다.

이 때문에 접속하려고 했던 도메인에 연락을 취했는데 실제로 THES END에서 문제가 발생했습니다.해결이 돼서 대본이 다시 돌아왔어요.

그러니까... 머리카락을 뽑고 있다면 openssl에 접속하려고 하는 위치에서 반응이 나오는지 확인해 보세요.어쩌면 이 문제는 결국 국지적인 것이 아닐 수도 있다.

'열어주세요'를 .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에서 "를 클릭하거나 CMD를 닫거나 열 Wamp는 "Restart All Services"를 클릭하여 CMD를 닫거나 다시 열 필요가 없습니다.

시도해 보셨나요?

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

중간자 공격에 노출될 위험을 감수하려면 확인을 건너뛸 수 있습니다.

나는 나에게 맞는 해결책을 찾았다.최신 Guzzle에서 버전 4.0으로 다운그레이드 했더니 작동했어요.

composer.json에 "guzzlehttp/guzle"을 추가합니다. "~4.0"

도움이 되었으면 좋겠다

WAMP에게 있어서, 이것이 마침내 나에게 통했던 것입니다.
다른 솔루션과 비슷하지만 이 페이지에서 설명한 솔루션 및 웹 상의 다른 위치는 작동하지 않았습니다.몇 가지 사소한 세부 사항은 달랐다.
PEM 파일을 저장하는 위치 중 하나가 중요했지만 충분히 명확하게 지정되지 않았습니다.
WHITE의 경우php.ini편집할 파일이 올바르지 않습니다.니면면둘둘다다
Windows 10 WAMP 3.2.0 2020년

pem 파일을 가져오는 링크:

http://curl.haxx.se/ca/cacert.pemhttpcurl.haxx.se/ca/.pem
를 복사하여 같이 합니다.cacert.pem를 참조해 주세요.

이 위치에 PEM 파일 저장

<wamp install directory>\bin\php\php<version>\extras\ssl
"php7..pem "wamp64\bin\php\php.7.12\extras\ssl\cacertpem" 입니다.

*(처음에는 다른 곳에 저장해 두었습니다만, php.ini 파일에 저장 장소를 표시했지만 동작하지 않았습니다). 다른 장소도 동작할 수도 있고 그렇지 않을 수도 있습니다. 이 장소가 추천 장소였습니다.이유는 알 수 없습니다.)


<wamp install directory>= WAMP 치치 。
::T:\wamp64\

<php version>하고 있는 (goto: WAMP: :::::: php: (알 got got, goto:WAMP icon tray -> PHP <version number>
가 7인 입니다.
::php7.3.12

편집할 php.ini 파일

의 자세를 밝히다를 php.ini, 집용용 、 goto :WAMP icon tray -> PHP -> php.ini.
::T:\wamp64\bin\apache\apache2.4.41\bin\php.ini
주의: 이것은 php 디렉토리에 있는 파일이 아닙니다!


파일을 편집하는 것처럼 보였지만:T:\wamp64\bin\apache\apache2.4.41\bin\php.ini ,
그 .T:/wamp64/bin/php/php7.3.12/phpForApache.ini.

편집은 .php.ini실제로 편집하고 .phpForApache.ini파일(symblinks에 대한 정보가 있는 게시물)

여기 맨 위에 있는 댓글들을 보시면php.ini특정 파일을 편집하지 않도록 명시되어 있습니다.
편집을 위해 여는 파일에 이 경고가 포함되어 있지 않은지 확인하십시오.

확장자 Link Shell Extension을 설치하면 추가된 탭을 통해 파일 속성 창에서 심볼 링크 대상을 볼 수 있습니다.여기 이 확장에 대한 더 많은 정보와 함께 SO 답변이 있습니다.

다양한 버전의 php를 동시에 실행하는 경우 PEM 파일을 관련된 각 php 디렉토리에 저장해야 할 수 있습니다.

php.ini 파일에서 편집하는 내용:

PEM 파일에 대한 경로를 다음 위치에 붙여넣습니다.

  • ;curl.cainfo =PEM을 사용합니다.
    ::curl.cainfo = "T:\wamp64\bin\php\php7.3.12\extras\ssl\cacert.pem"

  • ;openssl.cafile=PEM을 사용합니다.
    ::openssl.cafile="T:\wamp64\bin\php\php7.3.12\extras\ssl\cacert.pem"

크레딧:

공식 자원은 아니지만, 마지막 세부 사항을 정리한 유튜브 비디오 링크(https://www.youtube.com/watch?v=Fn1V4yQNgLs)소개합니다.

모두 정답입니다.그러나 가장 중요한 것은 올바른 php.ini 파일을 찾아야 한다는 것입니다.cmd " php --ini " 에서 이 명령어를 체크하는 것은 올바른 php.ini 파일을 찾기 위한 정답이 아닙니다.

편집하면

curl.cainfo ="PATH/cacert.pem"

확인하다

var_dump(openssl_get_cert_locations()); 

curl.curlfo는 값이 있어야 합니다.그렇지 않으면 php.ini 파일이 올바르지 않습니다.

*wamp/bin, xxamp/bin 또는 사용하는 서버를 *.ini로 검색하여 하나씩 변경하여 확인하시기 바랍니다.*

나는 이 문제를 해결하기 위해 너무 많은 시간을 소비했다.

저는 PHP 버전 5.5를 가지고 있어서 5.6으로 업그레이드해야 했습니다.

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

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

답변은 Guzles 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.

로컬 머신에서 Wordpress 어플리케이션 패스워드 기능을 사용하시는 분들을 위해.요.wp-includes\certificates\ca-bundle.crt

텍스트 편집기에서 이 파일을 열고 서버의 인증서를 추가합니다.

  1. 자기서명증명서(.crt) 파일을 열고

  2. 다음을 포함한 모든 복사

----BEGIN CERTIFICATE-------

----- 증명서를 종료합니다.---

  1. ★★★★★★★★★★의 마지막에 붙여넣기wp-includes\certificates\ca-bundle.crt

Laravel 4 php를 4 에서도 같은 했습니다.guzzlehttp/guzzle SSL 이 정지되어 "error 되었습니다.어떤 이유로 메일건의 SSL 증명서가 갑자기 검증이 정지되어 동일한 "error 60" 메시지가 나타납니다.

처럼 공유 하지 않고 php.ini은 불가능하다, 하다 안 된다., 이 는 "Guzle"을 로 할 .이 코드는 아마도php.ini★★★★

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

여기서 Guzle은 cURL 환경에서 제공되는 파일을 사용하지 않고 현재 오래된 내부 cacert.pem 파일을 강제로 사용합니다.적어도 Linux에서 이 행을 변경하면 cURL의 기본 SSL 검증 로직을 사용하도록 Guzzle을 설정하여 문제를 해결합니다.

「 」의 이 에,vendor조작을 의도한 것이 아니라, Guzzle 클라이언트의 사용법을 설정하는 것이 더 나은 해결책입니다만, 이것은 Laravel 4에서는 너무 어려웠습니다.

이렇게 하면 다른 사람이 디버깅을 몇 시간 줄일 수 있을 텐데...

이것은 엣지 케이스일 가능성이 있습니다만, 이 경우는 클라이언트컨피규레이션(에서 이미 설정)이 아니라 리모트서버가 올바르게 설정되어 있지 않은 것이 문제입니다.

체인에 중간 인증서를 보내지 않았습니다.Chrome을 사용하여 사이트를 브라우즈 할 때는 오류가 없었지만, PHP에서 다음과 같은 오류가 발생했습니다.

cURL 오류 60

리모트 Web 서버 설정에 중간 증명서를 포함하면 동작합니다.

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

https://whatsmychaincert.com/

가 뛰었을 때'var_dump(php_ini_loaded_file());'은 제 되어 있습니다.'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'

내을 로드하도록 php.이해야 했습니다.php.ini는 php.ini로 편집해야 합니다.'C:\Development\bin\apache\apache2.4.33\bin\php.ini'openssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"https://curl.haxx.se/docs/caextract.html에서 증명서 파일을 다운로드하여 저장했습니다.

Windows 10 에서는, drupal 8, wamp 및 php7.2.4 를 사용합니다.

Centos 7을 virtualmin 무료 버전으로 사용하고 있습니다.Virtualmin을 사용하여 워드프레스 웹사이트를 만들 수 있습니다.SSL 증명서를 자동적으로 갱신하는 기능이 있습니다./etc/httpd/conf/httpd.conf에는 SSLCertificateChainFile 엔트리가 포함되어 있지 않습니다.이 값은 /home/websitname/ssl.combined와 같이 설정해야 합니다.따라서 해당 파일을 업데이트하고 Apache를 재시작하면 이 문제가 해결됩니다.워드프레스용 제트팩 플러그인을 설치하려다 문제가 발견되었습니다.인터넷 검색 결과 SSL이 설정되어 있지 않은 것을 알 수 있었습니다.나는 Redhat의 인증서 설치 방법에 대한 지침을 따랐다.나는 이것이 누군가에게 도움이 되었기를 바란다.

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

update-ca-certificates

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

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

거즐 버전 5

이 디폴트 설정은, 나에게 있어서 유효합니다.필요한 https를 디세블로 합니다.

  $options = [
    'defaults' => ['verify' => false],
  ];
  new GuzzleClient($options);

그 외의 경우는, ca 의 패스를 설정하는 경우는, 다음과 같이 변경합니다.

['verify' => '/path/to/cacert.pem']

Windows 를 사용하고 있기 때문에, 패스 구분자는 「\」(Linux 의 경우는 「/」)이라고 생각합니다.를 .DIRECTORY_SEPARATOR코드 이동성이 향상됩니다.

시험:

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

EDIT: 전체 경로를 기록합니다.상대 패스에 문제가 있었습니다(다른 베이스 디렉토리에서 컬이 실행되었을 가능성이 있습니다).

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

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

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

언급URL : https://stackoverflow.com/questions/29822686/curl-error-60-ssl-certificate-unable-to-get-local-issuer-certificate