【问题标题】:Php cURL error:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failurePHP cURL 错误:错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败
【发布时间】:2019-12-21 09:59:34
【问题描述】:

**我已经搜索了 stackoverflow 以及其他来源,不幸的是,即使我尝试了各种方法,我也没有完美的解决方案来解决这个问题,所以我的请求是帮助代码不共享任何链接**

我在 Windows 7 上使用 ZeroXIII - 13.3.2 这是我用于下载网页的 php Curl 函数

function gdllssl3($target_url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36');
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt ($ch, CURLOPT_CAINFO, "D:\cacert-2019-05-15.pem");
curl_setopt($ch, CURLOPT_SSLVERSION,4);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
$html= curl_exec($ch);
if (!$html) {
        echo "<br />cURL error number:" .curl_errno($ch);
        echo "<br />cURL error:" . curl_error($ch);
}
return $html;
}


echo $url=gdllssl3('https://www.ratemyagent.com.au/real-estate-profile/sales/new-south-wales/agents');

它返回这个错误

cURL 错误编号:35 cURL 错误:错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败

使用从 Mozilla 提取的最新 CA 证书

【问题讨论】:

  • ServerHello TLS 消息发生在任何证书交换之前,因此问题与您使用的任何证书或 CA 无关。
  • curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 这是非常糟糕并且不应该这样做。你打开自己的劫持攻击,基本上这使做 HTTPS (TLS) 的任何用处无效,你还不如做 HTTP。
  • 通用评论:说“我已经搜索过......我没有完美的解决方案......即使我尝试了各种方式”绝对没有用(你可以编辑你的问题以删除它)不添加任何东西)。没有人可以知道您找到了哪些解决方案以及您到底测试了什么。相反,您应该清楚地说明您尝试过什么,获得了什么结果,以及您期望什么。像您一样的“通知”不会阻止人们判断您的问题与任何其他要求此错误的问题重复。

标签: php ssl curl


【解决方案1】:

您似乎正在尝试连接到支持 TLS v1.1 和 TLS v1.2,而不是 TLS v1.0 的远程服务器

您可以尝试更改此行吗:

curl_setopt($ch, CURLOPT_SSLVERSION, 4);

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_1);

CURLOPT_SSLVERSION 4 (CURL_SSLVERSION_TLSv1_0) 表示 TLS v1.0,而5 (CURL_SSLVERSION_TLSv1_1) 表示 TLS v1.1

有关信息,TLS v1.0 现已弃用,出于安全原因必须避免使用。 https://blog.pcisecuritystandards.org/are-you-ready-for-30-june-2018-sayin-goodbye-to-ssl-early-tls

最终,正如 Patrick Mevzek 在下面的 cmets 中所提到的,您最好完全删除该行,让 curl 模块选择最受支持的协议,如文档中所述 (PHP cURL)

【讨论】:

  • 您不应强制使用特定版本。如果服务器支持 1.2(远胜于 1.1)呢?您可以自动协商,而不是强制 1.1 更重要的是,当服务器停止接受 1.1 时,您的代码将停止工作......除非在非常特定的条件下,更喜欢自动协商,库将自动选择最佳(最高版本)。请参阅文档,其中说“您最好不要设置它并让它使用默认值。”。
  • 但是,确实,使用符号常量比使用整数要好得多。谁会记得 4 在 curl 中代表 TLS 1.0
  • 我完全同意你的看法,它仍然是 OP 理解这个 curl 选项含义的一种方式(也许还有其他使用的选项的含义,比如在使用 CAINFO 时使用 VERIFYPEER false。 ..)
  • 你仍然可以给他一个更好的建议,让他完全删除那条线......
  • 事实上,基于ssllabs.com/ssltest/… 服务器能够协商 1.1 或 1.2,因此最好使用最大的一个,即 1.2,而不是强制降级到 1.1。然而,正如他提到的使用 Windows 7 时,OP 可能存在问题。基于ssllabs.com/ssltest/clients.html,一些客户端无法在 Windows 7 上执行 1.2。此操作系统版本将在 6 个月(2020 年 1 月)内 EOL 参见support.microsoft.com/en-us/help/13853/…
猜你喜欢
  • 2016-12-12
  • 2015-12-02
  • 1970-01-01
  • 2016-05-04
  • 2016-05-01
  • 2016-04-27
  • 2016-08-14
  • 2017-05-14
相关资源
最近更新 更多