로컬 개발 환경에서 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 서버
- 다른 환경과 유사
- cacert.pem을 다운로드하여 압축을 풉니 다 (깨끗한 파일 형식 / 데이터).
- 다음 디렉토리에 넣으십시오.
C : \ xampp \ php \ extras \ ssl \ cacert.pem
- php.ini에서이 줄을이 섹션에 넣으십시오 ( “c : \ xampp \ php \ php.ini”) :
;;;;;;;;;;;;;;;;;;;; ; php.ini Options ; ;;;;;;;;;;;;;;;;;;;; curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
-
웹 서버 / 아파치를 다시 시작하십시오
-
문제 해결됨!
답변
주의 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.conf
C:\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.pem
php.ini 또는 Zend 서버 설정 (OpenSSL 아래)에서 사용할 수 있습니다.
curl 웹 사이트의 curl / Mozilla에서 인증서 번들을 사용할 수도 있습니다. 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
유닉스.)
답변
cartalyst / stripe 가 사용하는 Guzzle 은 다음을 수행하여 서버 인증서를 확인하기위한 적절한 인증서 아카이브를 찾습니다.
openssl.cafile
php.ini 파일에 설정되어 있는지 확인하십시오 .curl.cainfo
php.ini 파일에 설정되어 있는지 확인하십시오 ./etc/pki/tls/certs/ca-bundle.crt
존재 하는지 확인 (Red Hat, CentOS, Fedora; ca-certificates 패키지에서 제공)/etc/ssl/certs/ca-certificates.crt
존재 하는지 확인 (우분투, 데비안, ca 인증서 패키지에서 제공)/usr/local/share/certs/ca-root-nss.crt
존재 하는지 확인 (FreeBSD; ca_root_nss 패키지에서 제공)- 확인되는 경우
/usr/local/etc/openssl/cert.pem
(OS X, 사제 의해 제공) C:\windows\system32\curl-ca-bundle.crt
존재 하는지 확인 (Windows)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에 샷을주고 연결하려는 위치의 응답에 문제가 있는지 확인하십시오. 어쩌면 문제는 때때로 ‘현지’가 아닐 수도 있습니다.