cURL 訪問 HTTPS 預設會驗證 SSL 證書,開發/測試環境常因自簽證書導致失敗。本文提供最小可用配置,並說明生產環境的安全配置差異。
$url = 'https://www.google.com.hk';
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_HEADER => false, // 不返回 Header
CURLOPT_RETURNTRANSFER => true, // 返回字串
CURLOPT_SSL_VERIFYPEER => false, // ⚠️ 跳過證書驗證
CURLOPT_SSL_VERIFYHOST => false, // ⚠️ 跳過主機名驗證
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.1 Safari/537.11',
CURLOPT_TIMEOUT => 15,
CURLOPT_FOLLOWLOCATION => true, // 支援重導向
CURLOPT_MAXREDIRS => 5,
]);
$res = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP $httpCode\n";
echo $res;
| 選項 | 值 | 說明 |
|---|---|---|
| CURLOPT_SSL_VERIFYPEER | false | 不驗證伺服器證書真偽(開發用) |
| CURLOPT_SSL_VERIFYHOST | false | 不驗證證書 CN/SAN 與域名匹配(開發用) |
| CURLOPT_USERAGENT | 自定字串 | 模擬瀏覽器,防反爬蟲攔截 |
| CURLINFO_HTTP_CODE | 獲取狀態碼 | 200/301/404/500 等 |
// 1. 使用系統 CA 憑證庫(Linux 通常內建) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 2 = 檢查 CN/SAN 匹配 curl_setopt($ch, CURLOPT_CAINFO, '/etc/ssl/certs/ca-certificates.crt'); // 指定 CA 憑證路徑 // 2. 或使用 cacert.pem(跨平台通用) // 下載:https://curl.se/ca/cacert.pem curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/cacert.pem');
curl_setopt($ch, CURLOPT_SSLCERT, '/path/to/client.pem'); // 客戶端證書 curl_setopt($ch, CURLOPT_SSLKEY, '/path/to/client.key'); // 私鑰 curl_setopt($ch, CURLOPT_KEYPASSWD, 'keypassword'); // 私鑰密碼(如有)
CURLE_SSL_CACERT (60):CA 憑證路徑錯誤或缺失 → 設定 CURLOPT_CAINFO。CURLE_SSL_CONNECT_ERROR (35):TLS 版本不支援 → 嘗試 CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2。CURLE_PEER_FAILED_VERIFICATION (51):證書過期/自簽/域名不符 → 生產環境必須修正證書,不可長期關閉驗證。掌握 HTTPS cURL 配置是 PHP 後端串接第三方 API、微服務通訊、爬蟲開發的必備基本功。