Ошибка cURL во время вызова API. Номер ошибки cURL: [60] SSL-сертификат, проблема: самозаверяющий сертификат в цепочке сертификатов

Добрый день, я новичок в настройках сервера. В настоящее время я использую laravel 5.4 для интеграции моего приложения quickbooks на мой рабочий сервер http://qb.dagnum.com/connect, но я продолжаю получать эту ошибку

(1/1) SdkException
cURL error during making API call. cURL Error Number:[60] with error:[SSL certificate problem: self signed certificate in certificate chain]

Я добавил пакет, используя «композитор требует quickbooks/v3-php-sdk». на сервере также установлен SSL-сертификат, но я все равно получаю сообщение об ошибке.

мой код:

use App\Http\Controllers\Controller;   
use QuickBooksOnline\API\DataService\DataService;

class Auth2Controller extends Controller
 {
  public function index()
   {

        $dataService = DataService::Configure(array(
         'auth_mode' => 'oauth2',
         'ClientID' => "Q0lCkcEshsGMHOEula2r5RKc2yhxvMsYEpKN1lw1WZwyfd1Si6",
         'ClientSecret' => "gE0F9hLgwx9OBzRpNxyOvWJH6L2fIhzAwBugPJHq",
         'accessTokenKey' => 'eyJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiZGlyIn0..4z4Assj4x1qt8H4DtQco6A.nmV2jTxaDMVdFWEUO16q5qhbd5aD6U-U-RYnSNywqg-HPC
private function setSSL(&$curl_opt, $verifySSL){
      if($verifySSL){
          $curl_opt[CURLOPT_SSL_VERIFYPEER] = true;
          $curl_opt[CURLOPT_SSL_VERIFYHOST] = 2;
          $curl_opt[CURLOPT_CAINFO] = dirname(dirname(__FILE__)) . "/OAuth/OAuth2/certs/apiintuitcom.pem"; //Pem certification Key Path
     }
    }
jvwpMJU1a1S5X-PgPUy60WvVy_8p1awY7kIoFzTV4IhdFLrZpYtBUGCjcsvjxWeOSgP6oCayBEmCv7zzabtgB6vxU46jQqKX2IXYUGPPtyYO64hrgELFR4SKUK6boZiVnh8z19gnvsReKMmIINA3-NgC6QJqMRp6HWgzCa9RuDN9tCtrAK2dy5xmJRNSNgdv_gyg1bfdX4l4b30fLPzFk31fsTT9NTJq9PuGtdTsvUuCj7Hme6HPldD9TKYRXWU8TKrQQrQWEpdlbPr6F3rhP6IdmCv9t1XH_WzF_1IseRUoYhiTUjubig-j8gzwajIdYQTzpJQKJ92QiAEyt8k40WWg0v69hEC0w7WRBuUE-IJ50xWypqS_P28IWt1G14rovZ97soGOteSik-41g1icR2zxfNhXGq7zO7oU5B8r-ej5Pb52T0MCMktgd6y32bqwo2pcEzblL2bZs7DZ7LDx5peY4TIfGW21crTE6xjhRr7LdqB8K505pRqIOP20eaRgwtGHLZ3bdBt1_negw2AGjc409BM0nLzzmODxr3yo-YdGwkcOjm5QgbGAsrnpoSo9tSpxPHoN0vMRneRdsKCd6CZG5M1OIOMuj7spkm442tvwiAMCx2Fh-STG6fMnhOq7l_f8NW_3kscxtF2.obQxJKjPfi1KlaQQ_OUoNg', 'refreshTokenKey' => "L011509163184Q0K7DT40SVXhJXAfyoj6B6EbSr3Ty64yVvF5A", 'QBORealmID' => "123145857569084", 'baseUrl' => "https://sandbox-quickbooks.api.intuit.com" )); $dataService->setMinorVersion("9"); $CompanyInfo = $dataService->getCompanyInfo(); $error = $dataService->getLastError(); if ($error != null) { echo "The Status code is: " . $error->getHttpStatusCode() . "\n"; echo "The Helper message is: " . $error->getOAuthHelperError() . "\n"; echo "The Response message is: " . $error->getResponseBody() . "\n"; echo "The Intuit Helper message is: IntuitErrorType:{" . $error->getIntuitErrorType() . "} IntuitErrorCode:{" . $error->getIntuitErrorCode() . "} IntuitErrorMessage:{" . $error->getIntuitErrorMessage() . "} IntuitErrorDetail:{" . $error->getIntuitErrorDetail() . "}"; } }

Я также видел функцию завитка

private function setSSL(&$curl_opt, $verifySSL){
      if($verifySSL){
          $curl_opt[CURLOPT_SSL_VERIFYPEER] = true;
          $curl_opt[CURLOPT_SSL_VERIFYHOST] = 2;
          $curl_opt[CURLOPT_CAINFO] = dirname(dirname(__FILE__)) . "/OAuth/OAuth2/certs/apiintuitcom.pem"; //Pem certification Key Path
     }
    }

пытался заменить

$curl_opt[CURLOPT_CAINFO] = dirname(dirname(__FILE__)) . "/OAuth/OAuth2/certs/apiintuitcom.pem";

to `$curl_opt[CURLOPT_CAINFO] ="/home/servername/public_html/quickbooks_app/resources/cert/cacert.pem";` 

но я получаю эту ошибку Http Status Code: [401] Http Response Body is null or Empty.

Что мне сделать, чтобы исправить это, пожалуйста..


person melvnberd    schedule 03.08.2017    source источник
comment
Удачи найти ответ?   -  person vfranchi    schedule 19.08.2017


Ответы (2)


Я удалил файл apiintuitcom.pem, поставляемый с SDK, и начал использовать файл cacert.pem, который можно найти на PHP_OAuth2.0 пример приложения. Я также использовал неправильный baseUrl, но я изменил его на ваш. Это исправило ошибку для меня. Мой метод setSSL теперь выглядит так:

private function setSSL(&$curl_opt, $verifySSL){
  if($verifySSL){
      $curl_opt[CURLOPT_SSL_VERIFYPEER] = true;
      $curl_opt[CURLOPT_SSL_VERIFYHOST] = 2;
      $curl_opt[CURLOPT_CAINFO] = dirname(dirname(__FILE__)) . "/OAuth/OAuth2/certs/cacert.pem"; //Pem certification Key Path
  }
}

Мой $dataService почти такой же, как твой.

person vfranchi    schedule 19.08.2017

вы идете в /vendor/quickbooks/v3-php-sdk/src/Core/HttpClients и редактируете CurlHttpClient.php

найти

// $curl_opt[CURLOPT_CAINFO] = dirname(dirname(__FILE__)) . "/OAuth/OAuth2/certs/apiintuitcom.pem"; //Pem certification Key Path

изменить его на

' $curl_opt[CURLOPT_CAINFO] ="/home/folder/public_html/quickbooks_app/resources/cert/cacert.pem"; 

примечание: вы можете разместить свой cacert.pem где угодно, просто измените адрес, по которому вы его связываете.

вы можете получить cacert.pem на этом сайте https://curl.haxx.se/docs/caextract.html

person melvnberd    schedule 19.08.2017