PHP 5.6中cURL发起HTTPS请求遇SSL未知协议错误求助
解决PHP 5.6 cURL HTTPS POST请求的SSL协议错误
问题原因
你遇到的error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol错误,核心原因是PHP 5.6环境下的cURL与服务器的SSL/TLS版本协商不匹配,或者未处理服务器的重定向导致请求流向了非HTTPS端口。而命令行curl版本通常更更新,能自动完成正确的版本协商和重定向处理。
解决方案
在你的PHP代码中添加两个关键cURL选项即可解决:
- 跟随重定向:对应命令行的
--location参数,处理服务器可能存在的重定向请求 - 强制指定TLS版本:明确使用TLSv1.2(多数现代服务器支持的版本),避免版本协商失败
修改后的完整代码
// The endpoint URL $url = "https://url.com"; // The headers $headers = array( 'Authorization: Basic bm9zOm5vcw==', 'Content-Type: application/json' ); // The request payload $data = array( "properties" => array( "downData.cmCER", "downData.rxPwr", "downData.snr", "regStatusCode", "cmResetCnt", "upData.cmCER", "upData.snr", "upData.txPwr" ), "startts" => "2024-10-10T11:49:30.936Z", "endts" => "2024-10-17T11:49:30.936Z", "deviceId" => array("111111111") ); // Initialize the cURL session $ch = curl_init(); // Set the cURL options curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Insecure, ignores SSL verification curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // Insecure, ignores SSL verification curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); // 添加以下两个关键选项 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 跟随重定向 curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); // 强制使用TLSv1.2 // Execute the cURL request $response = curl_exec($ch); // Check for errors if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } else { // Output the response echo $response; } // Close the cURL session curl_close($ch);
额外检查点
- 确认URL中的端口是否正确(默认HTTPS端口是443,若服务器使用其他端口需明确指定)
- 对比PHP代码与命令行的
deviceId参数长度(你代码中是9位,命令行是10位),避免后续请求因参数不匹配失败 - 通过
phpinfo()查看PHP的cURL扩展版本及支持的SSL/TLS版本,确认是否支持TLSv1.2
内容的提问来源于stack exchange,提问作者One Service
相关产品推荐
相关产品推荐

