我知道有幾篇關于這個主題的帖子,但我已經嘗試了很多,但沒有任何效果。
curl_setopt($ch, CURLOPT_URL, "https://127.0.0.1:2288");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_USERPWD, $this->username . ":" . $this->password);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $pRequest);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CAINFO, "/etc/ssl/certs/cacert.pem");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
當我在 Ubuntu 20.04 機器上執行它時,我收到此錯誤:
Fatal error: Uncaught RuntimeException: Unable to connect to https://127.0.0.1:2288/ Error: SSL certificate problem: self signed certificate
該證書是 curl.se/docs/caextract.html 中的當前版本
php.ini:
extension=curl
extension=php_curl.dll
curl.cainfo="/etc/ssl/certs/cacert.pem"
如果不禁止 curl ssl 連接,我還能做什么?
uj5u.com熱心網友回復:
如果您使用自簽名證書,則必須將其添加到受信任的證書中,或者必須關閉驗證。對于第二種情況,只需將 CURLOPT_SSL_VERIFYPEER 切換為 false。
uj5u.com熱心網友回復:
您正在Ubuntu 上安全地連接到 localhost,并且正如您的錯誤所示,您的服務器正在使用自簽名證書進行回應。您的代碼指定 curl 應嘗試驗證它連接到的主機(本地主機,在您的情況下):
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
根據docs,2您的代碼中的值CURLOPT_SSL_VERIFYHOST是這樣記錄的:
2 驗證 SSL 對等證書中的 Common Name 欄位或 Subject Alternate Name 欄位是否與提供的主機名匹配。0 不檢查名稱。1 不應該使用。在生產環境中,此選項的值應保持為 2(默認值)。
如果您想嚴格遵循檔案的建議,您必須將某個域映射到 localhost 并在您的服務器上為該域安裝證書。AFAIK,您無法獲得 127.0.0.1 的證書,因為該特殊 IP 地址總是指 localhost ......這是一個很長的故事,但任何人簽署這樣的證書都沒有意義。
您的另一個選擇是告訴 curl 不要將 ssl 連接驗證CURLOPT_SSL_VERIFYHOST為零:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// you may also need to set this?
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
這告訴 curl 不要費心驗證證書。如果您可以控制自己的服務器并且您的服務器沒有以某種方式受到損害,這應該是相當安全的。
編輯 我想補充一點,從 curl.se 下載證書提取物只是抓取了一組廣泛信任的簽名/證書,恰好是Firefox使用的包。此證書包用于檢查您可能訪問的任何域,方法是將域證書上的簽名與一些由可信組織簽署的大/重要證書進行比較。它永遠不會有助于驗證自簽名證書。有關此詳細概念的更多資訊,請嘗試閱讀有關Web of Trust 的資訊。
我還應該提到,您可能可以使用一些命令來獲取本地計算機發出的證書并配置您的 curl 代碼以使用該證書,但是,CURLOPT_SSL_VERIFYHOST設定2指示 curl 檢查Common Name此證書的欄位您要連接的 IP 地址或域。在我的 ubuntu 作業站上,證書的通用名稱是“Ubuntu”——這與 localhost 或 127.0.0.1 都不匹配。要使這種方法起作用,您必須為您的機器生成一個新證書,其通用名稱與您連接的地址(localhost 或 127.0.0.1)相匹配,或者您需要設定一些東西來命名您的本地網路上的機器“ubuntu”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/321143.html
