使用cURL下载指定网页遭遇SSLv3握手失败问题求助
解决cURL SSL握手失败问题
问题原因
你遇到的error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure错误,是因为代码里强制指定使用SSLv3协议,而目标网站已不再支持这个不安全的旧协议,导致SSL握手无法完成。
修复方案
- 移除SSLv3强制设置:删掉代码中的
curl_setopt($ch, CURLOPT_SSLVERSION, 3);,让cURL自动和服务器协商支持的TLS版本(比如TLS1.2或TLS1.3)。 - 恢复SSL安全验证(可选但推荐):你之前关闭了
CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER,这会降低请求安全性。如果服务器证书正常,建议把这两个选项分别设为2和1,保证请求的安全性。
修改后的代码
<?php $url ="https://www.nawaiwaqt.com.pk/national"; function curl_download($Url){ if (!function_exists('curl_init')){ die('Sorry cURL is not installed!'); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $Url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 恢复安全的SSL验证设置(服务器证书正常时启用) curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); // 移除SSLv3强制设置,让cURL自动协商合适的TLS版本 $output = curl_exec($ch); if (!$output) { exit("Download un-successful : ".curl_error($ch)); } return $output; } $source=curl_download($url); $d=new DOMDocument(); $d->loadHTML($source); $title=$d->getElementsByTagName("title")->item(0)->textContent; $domx = new DOMXPath($d); $desc=$domx->query("//meta[@name='description']")->item(0); $description=$desc->getAttribute('content'); ?>
额外说明
如果恢复SSL验证后出现证书相关错误,可能是服务器证书不被本地CA信任,这时可以临时保留CURLOPT_SSL_VERIFYHOST=0和CURLOPT_SSL_VERIFYPEER=0,但建议尽快解决证书信任问题,避免安全风险。
内容的提问来源于stack exchange,提问作者Hardcode
相关产品推荐
相关产品推荐

