[php] cURL錯誤60:SSL證書:無法獲取本地頒發者證書



Answers

如果您在Guzzle中使用PHP 5.6,Guzzle已經轉而使用PHP庫autodetect來獲取證書,而不是它的過程( ref )。 PHP概述了here的變化。

找出PHP / Guzzle正在尋找證書的地方

您可以轉儲PHP正在使用的位置:

 var_dump(openssl_get_cert_locations());

獲得證書包

對於OS X測試,您可以使用自製軟件安裝openssl brew install openssl ,然後在您的php.ini或Zend Server設置(OpenSSL下)中使用openssl.cafile=/usr/local/etc/openssl/cert.pem

curl網站上的curl / Mozilla也提供證書包: https://curl.haxx.se/docs/caextract.htmlhttps://curl.haxx.se/docs/caextract.html

告訴PHP證書的地方

一旦你有了一個bundle,或者把它放在PHP已經在尋找的地方(你在上面找到的),或者在php.ini中更新openssl.cafile 。 (通常,在Unix上是/etc/php.ini/etc/php/7.0/cli/php.ini/etc/php/php.ini 。)

Question

我在本地開發環境中使用WAMP,並試圖收取信用卡,但收到錯誤消息:

cURL錯誤60:SSL證書問題:無法獲取本地頒發者證書

我在Google上搜索了很多,很多人都建議我下載這個文件: cacert.pem ,放在某個地方並在我的php.ini中引用它。 這是我的php.ini中的一部分:

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

然而,即使重新啟動服務器多次並更改路徑後,我也會得到相同的錯誤消息。

我使用Apache模塊中的WAMP並啟用了ssl_module。 從PGP擴展中,我啟用了php_curl。

仍然是相同的錯誤信息。 為什麼會發生?

現在我正在關注此修復: 如何修復PHP CURL Error 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');
}



如果您無法更改php.ini,則可以使用以下代碼指向cacert.pem文件:

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



我剛剛遇到了與使用guzzlehttp/guzzle作曲家包的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強制使用自己的內部cacert.pem文件,該文件現在可能已經過期,而不是使用cURL環境提供的文件 。 更改此行(至少在Linux上)將Guzzle配置為使用cURL的默認SSL驗證邏輯並解決了我的問題:

        'verify'          => true

如果您不關心SSL連接的安全性,也可以將其設置為false ,但這不是一個好的解決方案。

由於vendor中的文件不會被篡改,更好的解決方案是配置使用Guzzle客戶端 ,但這在Laravel 4中難以做到。

希望這可以節省其他人幾個小時的調試時間......




我做的是使用var_dump(openssl_get_cert_locations()); die; 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),並且我能夠得到它上班。

這是我唯一的解決方案。




注意Wamp / Wordpress / windows用戶。 我有這個問題好幾個小時,甚至沒有正確的答案是為我做的,因為我編輯錯誤的php.ini文件,因為問題是回答XAMPP而不是WAMP用戶,即使問題是WAMP。

這是我做的

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

把它放在C:\wamp64\bin\php\your php version\extras\ssl

確保文件C:\wamp64\bin\apache\apache(version)\modules位於C:\wamp64\bin\apache\apache(version)\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(Version)\extras\ssl\cacert.pem"

現在保存文件並重新啟動服務器,你應該很好去




當你使用Windows時,我認為你的路徑分隔符是'\'(在Linux上是'/')。 嘗試使用常量DIRECTORY_SEPARATOR 。 你的代碼將更加便攜。

嘗試:

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

編輯:並寫完整的路徑。 我有一些相對路徑的問題(也許捲曲是從另一個基礎目錄執行的?)




確保您通過Window Explorer直接打開php.ini文件。 (在我的情況下: C:\DevPrograms\wamp64\bin\php\php5.6.25 )。

不要在System Tray的Wamp / Xamp圖標菜單中使用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。




Related