簡體   English   中英

PHP cURL證書錯誤

[英]PHP cURL certificate error

我正在嘗試向我的PHP cURL請求添加自定義cer -certificate,但是我一直收到此錯誤:

error setting certificate verify locations:
  CAfile: /path/to/my/cert.cer
  CApath: none

我發現的有關此錯誤的全部是:

  1. 路徑是相對的。
    如您所見,我提供了一條絕對路徑。

  2. 路徑錯誤。
    我試圖去var_dump(file_exists($certLocation)); ,這使我成為true ,所以情況並非如此。

  3. 該文件的權限不正確。
    我已將權限設置為777 ,以進行調試。 錯誤仍然存​​在。

  4. 文件路徑在鏈中某處沒有+x權限。
    我也進行了設置,以確保從root開始的整個路徑具有+x權限,並且仍然沒有運氣。

我在這里不知所措,嘗試了所有可以找到的事實,事實是, 我什至不了解錯誤的實際含義。 什么是verify location 我所能理解的是,加載文件時出錯。

對此,我們深表感謝。 請參見下面的代碼示例。

謝謝。

我使用的代碼:

<?php

$oCurl = curl_init($this->baseUrl);
curl_setopt($oCurl, CURLOPT_FAILONERROR, 1);
curl_setopt($oCurl, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($oCurl, CURLOPT_CONNECTTIMEOUT, $this->connectionTimeout);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($oCurl, CURLOPT_POST, 1);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($oCurl, CURLOPT_CAINFO, "/tmp/cert.cer");

錯誤:

error setting certificate verify locations:
  CAfile: /tmp/cert.cer
  CApath: none

如果您的PHP安裝中沒有最新的CA根證書捆綁包,請在curl網站上下載該證書並將其保存在服務器上:

http://curl.haxx.se/docs/caextract.html

然后在您的php.ini文件中,例如在Windows上,為它設置一個path

curl.cainfo=c:\php\cacert.pem

注意:
關閉CURLOPT_SSL_VERIFYPEER允許中間人(MITM)攻擊,這是您不希望的!


SRC1- https: //stackoverflow.com/a/14064903/797495
SRC2- http://php.net/manual/zh/function.curl-setopt.php#110457

CURLOPT_CAINFOCURLOPT_SSL_VERIFYPEER結合使用

應將CURLOPT_CAINFO設置為PEM格式的CA或CA捆綁包。 我設法跟蹤了觸發該錯誤的curl代碼,這就是我發現的結果:

curl / openssl.c中

if(!SSL_CTX_load_verify_locations(connssl->ctx,
                                   data->set.str[STRING_SSL_CAFILE],
                                   data->set.str[STRING_SSL_CAPATH])) {
  if(data->set.ssl.verifypeer) {
    /* Fail if we insist on successfully verifying the server. */
    failf(data, "error setting certificate verify locations:\n"
          "  CAfile: %s\n  CApath: %s",
          data->set.str[STRING_SSL_CAFILE]?
          data->set.str[STRING_SSL_CAFILE]: "none",
          data->set.str[STRING_SSL_CAPATH]?
          data->set.str[STRING_SSL_CAPATH] : "none");
    return CURLE_SSL_CACERT_BADFILE;
  }
  ...

顯然,對SSL_CTX_load_verify_locations的調用返回0 ,並與將CURLOPT_SSL_VERIFYPEER設置為1的事實相結合,將觸發錯誤。

SSL_CTX_load_verify_locations是openssl庫中的函數,根據文檔( SSL_CTX_load_verify_locations文檔 ),應考慮以下語句:

“如果CAfile不為NULL,則它指向PEM格式的CA證書文件。”

“ CAfile是在執行SSL_CTX_load_verify_locations()函數時處理的。

“ 0-操作失敗,因為CAfile和CApath為NULL或在指定位置之一的處理失敗。” 在“ 返回值”部分下


您可以嘗試使用以下命令將cer轉換為pem

openssl x509 -in /tmp/cert.cer -inform der -outform pem -out /tmp/cert.pem

但我不能保證這會成功,因為我不確定您是否擁有正確的CA或CA Bundle文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM