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

Posted

技术标签:

【中文标题】Curl 失败:NSS:未找到客户端证书(未指定昵称)-在 Centos 7 上【英文标题】:Curl failed: NSS: client certificate not found (nickname not specified) - On Centos 7 【发布时间】:2021-07-03 12:21:52 【问题描述】:

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

当我尝试在 php 中使用 curl 时,我在尝试与苹果推送通知服务交互时收到以下错误 (https://api.push.apple.com/3/device/)

Curl failed: NSS: client certificate not found (nickname not specified)

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

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

重新编译 curl(成功了!Binary 可以执行调用,但 php 不行) 重新编译 php(没用,因为它需要安装 curl-devel,可能会再次链接到 NSS)

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

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

也许这是因为它的昵称中有特殊字符,我无法更改,因为 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,

【问题讨论】:

我没有针对您的确切问题的解决方案,但一种可能的解决方法是使用您编译的有效二进制文件,然后使用proc_open 之类的东西来解决这个问题。我知道这很老套,但至少你可以继续前进 【参考方案1】:

最后我得到了这个工作,这就是我所做的:

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

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

【讨论】:

以上是关于Curl 失败:NSS:未找到客户端证书(未指定昵称)-在 Centos 7 上的主要内容,如果未能解决你的问题,请参考以下文章

您指定的网页无法访问! 错误类型:403

科尔多瓦在运行项目时失败 - 未找到已安装的构建工具 - 未指定 compileSdkVersion

使用 OpenSSL 生成的 SSL 证书不适用于 NSS

未找到签名证书“​​iOS Distribution”

cURL SSL连接错误35与NSS错误-5961

当 curl 成功时,Java HTTPS 客户端失败 SSL 握手