CURL ERROR: Recv failure: Connection reset by peer
目標站點使用 HTTPS (SSL/TLS) 協議,cURL 預設會驗證 SSL 憑證。若未設定跳過驗證參數,連線會在 SSL 握手階段被伺服器重置。
<?php
$ch = curl_init();
// 關鍵:跳過 SSL 憑證驗證
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不驗證憑證來源
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不驗證主機名稱
// 其他常用設定...
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
}
curl_close($ch);
| 選項 | 值 | 說明 |
|---|---|---|
CURLOPT_SSL_VERIFYPEER | false | 停用對等憑證驗證(不檢查 CA 簽發鏈) |
CURLOPT_SSL_VERIFYHOST | false (或 0) | 停用主機名稱驗證(不檢查 CN/SAN) |
生產環境強烈不建議永久關閉驗證,這會暴露中間人攻擊風險。正確做法:
CURLOPT_CAINFO 指向本地 CA 憑證檔(.pem/.crt)CURLOPT_SSL_VERIFYPEER = true、CURLOPT_SSL_VERIFYHOST = 2// 生產環境安全配置範例
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . '/certs/ca-bundle.crt'); // 包含常見 CA 的 bundle
CURLOPT_SSL_VERIFYHOST = 1 已棄用,僅檢查 CN 存在性,必須用 2(檢查 CN/SAN 匹配)