cURL不会连接到HTTPS,而wget却连接到HTTPS(NSS错误-12286)


8

NSS error -12286使用从HTTPS下载文件时出现错误curl

我可以下载相同的文件而不会出现任何问题,wget因此可以排除任何防火墙或黑名单问题。

根据Qualys SSL Labs测试服务器工具,已经尝试过但没有运气的选项-k--cipher ecdhe_ecdsa_aes_128_gcm_sha_256,这是服务器首选的密码:https ://www.ssllabs.com/ssltest/analyze.html?d=intribunale.net&latest

这是cURL日志:

# curl -v https://www.intribunale.net/immobili
* About to connect() to www.intribunale.net port 443 (#0)
*   Trying 104.27.150.214... connected
* Connected to www.intribunale.net (104.27.150.214) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* NSS error -12286
* Closing connection #0
* SSL connect error
curl: (35) SSL connect error

我的库版本是:

# curl -V
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC 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

相关消息:www-archive.mozilla.org/projects/security/pki/nss/ref/ssl/…表示NSS错误-12286的意思是SSL_ERROR_NO_CYPHER_OVERLAP“无法与对等对象安全通信:没有通用的加密算法。” 本地和远程系统没有共享的密码套件。这可能是由于任一端的配置错误。可能是由于服务器配置错误,无法通过RSA密钥交换算法使用非RSA证书。
Celada

2
我可以将CentOS6.7 curl-7.19.7-46.el6 nss-3.21.0-0.3.el6_7的问题重现到测试服务器。默认情况下,它不提供任何ECC套件,并且由于您的服务器(Cloudfare)接受某些ECC(特别是ECDHE)套件的协商失败。通过--cipher[s]指定该ECDHE套件,它甚至不发送ClientHello,仅关闭连接并给出错误。这似乎是内部不同步的,也许是在RedHat长期否认ECC之后。RedHat wget使用OpenSSL,而最近的RedHat OpenSSL确实支持ECC(仅适用于P256 P384 P521,但这已经足够了)。
dave_thompson_085 '16

1
我的第一个选择是(0)不要使用curl,但是如果您真的希望我看到的选项是:(1)如果您有支持,请将其报告为错误,并希望他们进行修复。(2)是开源的;自己调试和修复。(3)它是开源的;根据应正常工作的openssl(而不是NSS)重新构建。(4)设置stunnel(使用openssl)作为纯SSL协议,告诉curl,http(notS)://localhost[:port]/whatever但是添加-H "Host: realhost"目标服务器就无法区分两者。...
dave_thompson_085 '16

1
...(5)类似但更正式:在此处使用openssl设置真实的HTTP代理,或者在控件中另一个系统上的任何TLS1.2-ECDHE兼容的SSL / TLS甚至在您的真实计算机上也可以使用VM,例如HAproxy或nginx甚至httpd,您可以使用普通HTTP或至少使用非ECDHE HTTPS进行连接,但使用良好的ECDHE HTTPS中继到真实服务器。
dave_thompson_085

1
NSS上游肯定会长期支持ECDHE。直到2014年末,RedHat多年以来一直出于模糊的“合法”原因,从其加密软件包(AFAIK全部,绝对是OpenSSL NSS OpenJDK)的构建中删除了ECC(的所有变体),在我之前称之为“长期拒绝”。我猜想当他们把它放回原处时,他们犯了一些可能轻微的错误,从而影响了curl / NSS的情况。我不知道有其他发行版可以做到这一点,但是有很多人可能会这样做。在我目前拥有的一个Ubuntu 14.04LTS Trusty中,curl使用OpenSSL并支持ECDHE。
dave_thompson_085 '16

Answers:


8

解决方案是使用CentOS 6的第三方存储库或从源代码构建升级到cURL 7.42


14
升级nss软件包(即yum update nss)或使用curl -1可能也可以解决此问题。
DiegoG '16

1
谢谢!我遇到此问题,因为服务器需要tlsv1.2。升级确实解决了我的问题。
hao

更新NSS是解决这个问题
儿子林


0

在具有最新的openssl软件包(1.0.1e)的CentOS 6上,您应该像DiegoG上面所述那样更新nss(yum更新nss)。命令update-ca-trust也可能会有所帮助。如果您通过php使用curl-重新启动Web服务器进程/服务(即重新启动服务httpd)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.