PHP cURL 错误“安全库失败”。
Posted
技术标签:
【中文标题】PHP cURL 错误“安全库失败”。【英文标题】:PHP cURL error "security library failure." 【发布时间】:2020-08-08 00:01:06 【问题描述】:我正在使用以下代码为 ios 发送 apns 通知。之前它工作正常,但我从 cURL“安全库故障”开始得到这个响应。代码为 0。
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($sample_alert));
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSLCERT, $certificate);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $pem_secret);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
这个问题似乎只发生在我的开发环境中,不管传入什么数据。
$url = "https://api.development.push.apple.com/3/device/$device_token";
$sample_alert =
"aps":"alert":"sample notif message","badge":"badge","sound":"default"
$headers =
["apns-topic: apns.topic"]
【问题讨论】:
它与 php 5.6 有什么关系?它只与这个版本有关吗? 不,该错误并非特定于 php5.6,它也出现在 php 7 上。此外,该错误刚刚开始在 PRODUCTION 上显示 您遇到了什么问题?成功的 API 调用是否返回“安全库失败”? 安全库故障显示为 curl_error(),错误代码为 0 和 35,这两者都表明 API 永远无法访问。 我遇到了同样的错误。如何解决? 【参考方案1】:我们面临同样的问题。我们的机器运行的是 CentOS 7、PHP 7、Curl 7.75。
我们添加了 curl 选项 curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_MAX_TLSv1_2);
,以强制将 TLS 限制为最高版本 1.2,但它不起作用,因为我们的 PHP 版本会发出警告,指出它不知道常量 CURL_SSLVERSION_MAX_TLSv1_2
。
我们有一个解决方法,使用所述常量的整数值而不是使用定义的常量。检查在 curl repo here 找到的值。
CURL_SSLVERSION_MAX_TLSv1_2 定义为 (CURL_SSLVERSION_TLSv1_2 393216
因此,我们添加了这个 curl 选项curl_setopt($ch, CURLOPT_SSLVERSION, 393216);
,它成功发送了一个请求,没有出现“安全库失败”错误。
PS。这只是设置最大 TLS 版本的一种解决方法。
PPS。正如manual 中所述,您应该让 curl 使用默认的 SSL 版本。因此,使用它需要您自担风险。此答案只是一种解决方法。
【讨论】:
【参考方案2】:我们有一个类似的错误,就像你说它从开发开始,昨天它也发生在生产中。
我们通过更新服务器上的 curl 来解决。 尝试在您的机器上启动相同的 curl,例如在我的 Mac 上,推送在此版本中运行良好:
curl 7.64.1 (x86_64-apple-darwin19.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.39.2
在使用较旧 curl 版本的服务器上,我们遇到了相同的错误安全库故障。 如果无法更新 curl,请尝试将此参数添加到调用中
--tls-max 1.2
【讨论】:
我也面临同样的问题。我已经更新了库但没有工作。----- 我正在运行 CentOS 7、Apache 2.4.46、PHP 7.4.15、CURL 7.75、OpenSSL 1.1.1j。但我仍然遇到同样的错误以上是关于PHP cURL 错误“安全库失败”。的主要内容,如果未能解决你的问题,请参考以下文章
CURL错误:Recv失败:通过对等方重置连接 - PHP Curl