首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP cURL 發起 HTTPS 請求的兩種解決方案(SSL 憑證驗證失敗處理)

     編輯:PHP 綜合知識

使用 cURL 存取 HTTPS 網址時,常遇到 SSL certificate problem: verify that the CA cert is OK 錯誤。本文提供兩種解決方案,並說明各自優缺點與適用場景。

錯誤原因

cURL 預設驗證伺服器 SSL 憑證,需本機擁有可信任的 CA 憑證包(cacert.pem)。若系統內建憑證過期、缺失,或目標站點使用自簽憑證,驗證即會失敗。

方案一:關閉驗證(快速測試、內網、信任環境)

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不驗證憑證
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不驗證域名匹配
// ... 其他選項
$response = curl_exec($ch);
  • ✅ 簡單、立即生效。
  • ❌ 中間人攻擊風險,生產環境嚴禁使用。

方案二:指定最新 CA 憑證包(生產環境標準做法)

  1. 下載最新 cacert.pem:https://curl.se/ca/cacert.pem
  2. 放置於專案可讀取路徑(如 /etc/ssl/certs/cacert.pem 或專案目錄)。
  3. 設定 cURL 使用該檔案:
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);  // 必須驗證
curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem'); // 指定 CA 檔案
// 若需驗證域名(預設 2),可保持預設或顯式設定
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
$response = curl_exec($ch);

常見問題排查

現象可能原因解決
仍報錯cacert.pem 路徑錯誤/無權限用 realpath() 確認絕對路徑,檢查 open_basedir
自簽憑證目標站點非公信 CA 簽發將自簽 CA 追加至 cacert.pem,或方案一(僅測試)
憑證過期目標站點憑證已過期聯繫站點更新,或暫時方案一
主機名不符IP 直接存取、CDN 域名不匹配檢查 CURLOPT_SSL_VERIFYHOST=2,確認 SNI 支援

進階:PHP 內建流處理(stream_context)

$ctx = stream_context_create([
    'ssl' => [
        'verify_peer' => true,
        'verify_peer_name' => true,
        'cafile' => __DIR__ . '/cacert.pem',
    ]
]);
$content = file_get_contents('https://example.com', false, $ctx);

最佳實踐總結

  1. 生產環境務必啟用驗證(CURLOPT_SSL_VERIFYPEER=true)。
  2. 定期更新 cacert.pem(建議每月或隨系統更新)。
  3. 容器化部署:基底映像檔安裝 ca-certificates 套件,自動維護憑證。
  4. 釘選憑證:高安全需求系統可實作 Certificate Pinning。

正確配置 SSL 驗證,是保障資料傳輸機密性與完整性的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved