PHP cURL 错误 "security library failure."
PHP cURL error "security library failure."
我正在使用以下代码为 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"]
我们有一个类似的错误,就像你说它从开发开始,昨天它也发生在生产中。
我们通过更新服务器上的 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, 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 << 16) 即 6 << 16 结果是 393216
因此,我们添加了这个 curl 选项 curl_setopt($ch, CURLOPT_SSLVERSION, 393216);
,它成功发送了一个请求,没有出现“安全库失败”错误。
PS。这只是设置最高 TLS 版本的解决方法。
PPS。如本 manual 所述,您应该让 curl 使用默认的 SSL 版本。所以使用它需要您自担风险。这个答案只是一个解决方法。
我正在使用以下代码为 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"]
我们有一个类似的错误,就像你说它从开发开始,昨天它也发生在生产中。
我们通过更新服务器上的 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, 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 << 16) 即 6 << 16 结果是 393216
因此,我们添加了这个 curl 选项 curl_setopt($ch, CURLOPT_SSLVERSION, 393216);
,它成功发送了一个请求,没有出现“安全库失败”错误。
PS。这只是设置最高 TLS 版本的解决方法。
PPS。如本 manual 所述,您应该让 curl 使用默认的 SSL 版本。所以使用它需要您自担风险。这个答案只是一个解决方法。