[英]PHP cURL certificate error
我正在嘗試向我的PHP cURL請求添加自定義cer
-certificate,但是我一直收到此錯誤:
error setting certificate verify locations:
CAfile: /path/to/my/cert.cer
CApath: none
我發現的有關此錯誤的全部是:
路徑是相對的。
如您所見,我提供了一條絕對路徑。
路徑錯誤。
我試圖去var_dump(file_exists($certLocation));
,這使我成為true
,所以情況並非如此。
該文件的權限不正確。
我已將權限設置為777
,以進行調試。 錯誤仍然存在。
文件路徑在鏈中某處沒有+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_CAINFO與CURLOPT_SSL_VERIFYPEER結合使用
應將CURLOPT_CAINFO
設置為PEM格式的CA或CA捆綁包。 我設法跟蹤了觸發該錯誤的curl代碼,這就是我發現的結果:
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.