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 上的主要内容,如果未能解决你的问题,请参考以下文章