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 版本。所以使用它需要您自担风险。这个答案只是一个解决方法。