Curl 失败:NSS:未找到客户端证书(未指定昵称)- 在 Centos 7 上

Curl failed: NSS: client certificate not found (nickname not specified) - On Centos 7

我知道之前有人在 SO 上问过这个问题,但我认为我的情况有点不同:

当我尝试在 PHP 中使用 curl 时,我在尝试与苹果推送通知服务 (https://api.push.apple.com/3/device/)

交互时收到以下错误
Curl failed: NSS: client certificate not found (nickname not specified)

这是因为在 centos 上,php 是使用 NSS 而不是 OpenSSL 的 curl 构建的。

到目前为止我尝试了什么:

所以我的下一个方法是解决这个 NSS 问题,但事实证明 NSS 是一个非常糟糕的软件,因为只是简单地重命名导入的 lets-ecnrypt 证书不起作用.. ..

谁能 解释一下我该如何解决这个问题?我已经尝试将 lets encrypt 证书导入存储在 /etc/pki/nssdb 中的 NSS 数据库,这很有效 - 但不幸的是,即使我在 CURLOPT_SSLCERT = 中提供了它的昵称,该证书在 PHP 中也无法识别> 'nickname'.

也许这是因为它的昵称中有特殊字符,我无法更改,因为 NSS 无法重命名 (lol)。

当我直接尝试使用

在 php 中提供证书时
CURLOPT_SSLCERT => $certFile,
CURLOPT_SSLKEY => $keyFile,
CURLOPT_CAINFO => $caCertFile

我得到:

 Curl failed: Peer's Certificate issuer is not recognized.

我还通过

关闭了同行验证

CURLOPT_SSL_VERIFYPEER => FALSE

结束于

 Curl failed: security library failure

有没有人可以教我如何修复它或如何在 centos 上使用 openssl 构建 curl 构建 php?

BR,

我终于开始工作了,这是我所做的:

  1. 使用 openssl 重新编译 curl 并将 libcurl.so.4 放入新文件夹 /home/mylibs/
  2. 已将所有库从 /usr/lib 复制到 /home/mylibs/ 而未替换我的 libcurl.so.4
  3. 找到系统的 php-cgi 二进制文件,将其重命名为 php-cgi-real
  4. 创建了一个空白文件 php-cgi

#! /bin/bash
export LD_PRELOAD=/home/mylibs/libcurl.so.4
exec php-cgi-real "$@"
  1. 重新启动服务
  2. 完成!