PHP CURL“NSS:找不到客户端证书(未指定昵称)”问题

Posted

技术标签:

【中文标题】PHP CURL“NSS:找不到客户端证书(未指定昵称)”问题【英文标题】:PHP CURL "NSS: client certificate not found (nickname not specified)" Issue 【发布时间】:2017-12-09 10:12:54 【问题描述】:

对单个特定 https 端点的请求在我的一台服务器上失败,并出现来自 php CURL 的“NSS:找不到客户端证书(未指定昵称)”错误。

当我使用verbose 选项从命令行运行相同的查询时,我得到了同样的错误,但之后我也得到了一个有效的响应(在同一个 CURL 请求中的错误之后)。

然后我为我的 PHP CURL 请求启用了verbose 选项并显示它以进行如下测试:

$error = curl_error($curl);

if ($error) 
        echo "cURL Error #:" . $error;

        rewind($verbose);
        $verboseLog = htmlspecialchars(stream_get_contents($verbose));

        echo "<pre>";
        print_r($verboseLog);
 else 
  echo $response;

并将其作为输出:

cURL Error #:NSS: client certificate not found (nickname not specified)
* About to connect() to <address> port 8001 (#0)
*   Trying <ip>... * connected
* Connected to <address> (<ip>) port 8001 (#0)
* skipping SSL peer certificate verification
* NSS: client certificate not found (nickname not specified)
* SSL connection using TLS_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*   subject: CN=*.<address>m,O=XXX A.S.,OU=IT,L=Umraniye,ST=Istanbul,C=TR
*   start date: Jun 11 12:52:03 2015 GMT
*   expire date: Jun 09 14:16:13 2018 GMT
*   common name: *.<address>
*   issuer: CN=GlobalSign Organization Validation CA - SHA256 - G2,O=GlobalSign nv-sa,C=BE
> POST /<url_part> HTTP/1.1
Host: <address>:8001
Accept: */*
Accept-Encoding: deflate, gzip
authorization: Basic UlBlahBlahnJrcjEyMzQ1Ng==
cache-control: no-cache
content-type: application/json
postman-token: eeefe018-7cac-1706-7b6d-847800a7ad0f
Content-Length: 333

< HTTP/1.1 200 OK
< set-cookie: sap-usercontext=sap-client=100; path=/
< set-cookie: SAP_SESSIONID_CFP_100=ohZvfO5ZOwq_LTE76Zgz9L-C0NdhlRHngM0AF6R3IFY%3d; path=/
< content-type: application/json; charset=utf-8
< content-length: 1150
< cache-control: max-age=0
< sap-cache-control: +180 
< sap-isc-uagent: 0
< 
* Connection #0 to host <address> left intact
* Closing connection #0

因此,CURL 请求以错误结束,但在详细日志中我们看到在错误之后还获取了有效响应。

这是我的问题:

    只要其他不同的https 端点完全正常工作,是否有任何方法可以克服此 NSS 问题?是否与端点的服务器配置连接并可以在那里解决? 如果第一项失败,是否可以不抛出 CURL NSS 错误,而是获取响应? CURLOPT_FAILONERROR 选项没有帮助。

CURL 是用 NSS 构建的:

curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

更新:

第二项可以关闭,因为这个错误真的很奇怪:curl_error返回错误,但curl_exec同时返回有效响应。

【问题讨论】:

也许看看 here 看看有没有适合你的情况。 @YvesLeBorg 不,它不适用,问题是我没有使用任何显式证书。 【参考方案1】:

尝试提供证书的绝对路径并添加“./”前缀。例如“./path-to-your-cert”

【讨论】:

问题是我没有使用任何显式证书。

以上是关于PHP CURL“NSS:找不到客户端证书(未指定昵称)”问题的主要内容,如果未能解决你的问题,请参考以下文章

解析php中curl

linux上怎么操作开启php curl扩展

PHP如何开启curl

PHP - curl实现采集

php curl 302问题

php curl get 参数