在一些 CentOS 机器上,cURL 和 PHP 出现了奇怪的问题。
本地运行的是 CentOS 6.3。远程运行的是 CentOS 5.9
在本地,盒子接收一个请求,将文件 scp 到远程服务器,然后通过 PHP 向远程服务器执行 cURL 请求以发送一些信息。请求总是在当天的第一次尝试时失败。后续请求工作正常。远程有一个有效的 SSL 证书——即便如此,关闭证书和主机验证也无法解决问题。
日志记录没有多大帮助。将详细程度提高到 11,最有意义的条目如下:
* About to connect() to www.example.com port 443 (#0)
* Trying 203.0.113.10... * connected
* Connected to www.example.com (203.0.113.10) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* NSS error -5938
* Closing connection #0
* SSL connect error
谷歌搜索错误也没有多大帮助。看起来 Twitter 也遇到了类似的问题(https://dev.twitter.com/discussions/1549) 他们显然已经修复了这个问题,但没有详细说明如何修复。
任何关于从哪里查找/做什么来缓解这个问题的想法都将受到赞赏。
答案1
这是使用 NSS 编译的 curl 的常见问题(仅限未使用 nss 编译的 redhat-linuxes、debian 和 suse curl 包)。您需要从没有 nss-library 的源编译 curl。
所以,我还没有解决 https-connections 如何与 nss-curl 协同工作。
curl --version curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 国家安全局/3.14.3.0zlib/1.2.7 libidn/1.26 libssh2/1.4.3 协议:dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 功能:AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz
curl --version curl 7.25.0 (x86_64-suse-linux-gnu) libcurl/7.25.0 OpenSSL/1.0.1e zlib/1.2.7 libidn/1.25 libssh2/1.4.0 协议:dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp 功能:AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
答案2
当我使用过时的 CentOS 6.x 系统连接到嵌入式设备时,我遇到了类似的“NSS 错误 -5938”,该设备停止接受 TLS 1.0,只允许 TLS 1.1 及更高版本。对我来说,解决方案是执行yum update
。我看到发生了以下更新:
---> Package curl.x86_64 0:7.19.7-46.el6 will be updated
---> Package curl.x86_64 0:7.19.7-52.el6 will be an update
...
---> Package nss.x86_64 0:3.21.0-0.3.el6_7 will be updated
---> Package nss.x86_64 0:3.21.3-2.el6_8 will be an update
我认为这可能是有帮助的具体改变:
$ rpm -q --changelog curl
[...]
* Mon Jan 11 2016 Kamil Dudka <[email protected]> 7.19.7-50
- use the default min/max TLS version provided by NSS (#1289205)
答案3
NSS 错误 5938 消息通常意味着服务器终止了您的连接。您应该检查 curl 目标的服务器端日志,以了解您的连接被终止的原因。
它可能很简单,例如“无法获取 X 的反向 DNS 主机名”。