如何修复 curl:(35)无法与对等方安全通信:没有通用加密算法
Posted
技术标签:
【中文标题】如何修复 curl:(35)无法与对等方安全通信:没有通用加密算法【英文标题】:How to fix curl: (35) Cannot communicate securely with peer: no common encryption algorithm(s) 【发布时间】:2015-09-15 10:54:08 【问题描述】:我正在尝试使用php curl
从https://torrage.com
访问和下载一些.torrent
文件。
但是什么也没发生,curl_error($ch)
给了
$ch = curl_init ('https://torrage.com/torrent/640FE84C613C17F663551D218689A64E8AEBEABE.torrent');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_VERBOSE,true);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close ($ch);
echo $error;
这给了。
Cannot communicate securely with peer: no common encryption algorithm(s).
如果我像这样从 shell 尝试
[root@prod1 yum.repos.d]# curl -I https://torrage.com
curl: (35) Cannot communicate securely with peer: no common encryption algorithm(s).
详细模式
[root@prod1 yum.repos.d]# curl -v https://torrage.com
* Rebuilt URL to: https://torrage.com/
* Trying 81.17.30.48...
* Connected to torrage.com (81.17.30.48) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* NSS error -12286 (SSL_ERROR_NO_CYPHER_OVERLAP)
* Cannot communicate securely with peer: no common encryption algorithm(s).
* Closing connection 0
curl: (35) Cannot communicate securely with peer: no common encryption algorithm(s).
系统信息centos 7.x86_64
[root@prod1 yum.repos.d]# uname -a
Linux prod1.localdomain 3.10.0-229.4.2.el7.x86_64 #1 SMP Wed May 13 10:06:09 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
卷曲版
[root@prod1 yum.repos.d]# curl -V
curl 7.29.0 (x86_64-redhat-linux-gnu)
openssl ,已打补丁。
[root@prod1 yum.repos.d]# openssl version -a
OpenSSL 1.0.1e-fips 11 Feb 2013
built on: Mon Jun 15 18:39:20 UTC 2015
platform: linux-x86_64
options: bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/etc/pki/tls"
engines: dynamic
验证 openssl 是否已修补。
[root@prod1 yum.repos.d]# rpm -q --changelog openssl | grep CVE-2014-0224
- fix CVE-2014-0224 fix that broke EAP-FAST session resumption support
- fix CVE-2014-0224 - SSL/TLS MITM vulnerability
我尝试过的:
1) 我曾尝试使用 HTTPS 的 HTTP,但该站点强制使用 HTTPS。 例如
[root@prod1 yum.repos.d]# curl -I http://torrage.com
HTTP/1.1 301 Moved Permanently
Server: nginx/1.9.0
Date: Mon, 29 Jun 2015 04:13:17 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: https://torrage.com/
2) 更新 ca-bundle.crt
cp /etc/pki/tls/certs/ca-bundle.crt /root/backup/
curl http://curl.haxx.se/ca/cacert.pem -o /etc/pki/tls/certs/ca-bundle.crt
3) 将 Curl 更新到最新版本 7.43.0
nano /etc/yum.repos.d/city-fan-for-curl.repo
有了这个 repo。
[CityFanforCurl]
name=City Fan Repo
baseurl=http://www.city-fan.org/ftp/contrib/yum-repo/rhel7/x86_64/
enabled=0
gpgcheck=0
然后做
yum update curl --enablerepo=CityFanforCurl
然后验证 curl 版本
[root@prod1 yum.repos.d]# curl -V
curl 7.43.0 (x86_64-redhat-linux-gnu) libcurl/7.43.0 NSS/3.18 Basic ECC zlib/1.2.7 libidn/1.28 libssh2/1.6.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets Metalink
4) 我试过这个来检查我的 curl 是否过时。
参考:https://unix.stackexchange.com/questions/162816/disable-sslv3-in-curl
[root@prod1 yum.repos.d]# curl -1IsS --ciphers ecdhe_ecdsa_aes_128_sha https://sslspdy.com
HTTP/1.1 200 OK
Server: nginx centminmod
Content-Type: text/html; charset=utf-8
Connection: close
Vary: Accept-Encoding
Strict-Transport-Security: max-age=31536000; includeSubdomains
Date: Mon, 12 Jan 1970 23:00:11 GMT
X-Page-Speed: ngx_pagespeed
Cache-Control: max-age=0, no-cache
我该如何解决这个问题?并使用PHP Curl
从 Torrage.com 下载文件?
*我无法使用 file_get_contents,因为我使用 curl_multi
进行同时下载。
更新 1:
正如 steffen-ullrich 所建议的
[root@prod1 randoadmin]# curl --ciphers ecdhe_rsa_aes_128_gcm_sha_256 -I https://torrage.com
HTTP/1.1 200 OK
Server: nginx/1.9.0
Date: Mon, 29 Jun 2015 05:54:17 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified: Mon, 29 Jun 2015 05:50:40 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding, Accept-Encoding
Strict-Transport-Security: max-age=31536000
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
但是这就是 shell 我如何用PHP-curl
来实现它?
更新 2:
我已经修改了代码并定义了在像这样使用 curl 时使用的密码。
$ch = curl_init ('https://torrage.com/torrent/640FE84C613C17F663551D218689A64E8AEBEABE.torrent');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'ecdhe_rsa_aes_128_gcm_sha_256');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_VERBOSE,true);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close ($ch);
echo $error;
echo $data ;
它工作得很好。非常感谢 steffen-ullrich 解决了这个问题。
【问题讨论】:
你是否也升级了你的 openssl 包? @Ja͢ck 不,我现在正在尝试。谢谢 @Ja͢ck 是的,它已经打了补丁。刚刚检查,参考:liquidweb.com/kb/… 【参考方案1】:在 Centos 7 或更高版本上将 curl 升级到最新版本,即 7.29.* 为我解决了这个问题。
【讨论】:
在尝试了上述密码和 nss 更新建议后,它对我有用。【参考方案2】:也有可能检查
在 unix 上(希望也赢):
> curl -v https://www.youtube.com > test.html
注意:将“https://www.youtube.com”替换为带有协议的域
将输出定向到 test.html,因此我们只会在屏幕上看到想要的信息
结果:
* Rebuilt URL to: https://www.youtube.com/
* Hostname was NOT found in DNS cache
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 2404:6800:4005:80d::200e...
* Trying 216.58.221.238...
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to www.youtube.com (2404:6800:4005:80d::200e) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs/
* SSLv3, TLS Unknown, Unknown (22):
[data not shown]
* SSLv3, TLS handshake, Client hello (1):
[data not shown]
* SSLv2, Unknown (22):
[data not shown]
* SSLv3, TLS handshake, Server hello (2):
[data not shown]
* SSLv2, Unknown (22):
[data not shown]
* SSLv3, TLS handshake, CERT (11):
[data not shown]
* SSLv2, Unknown (22):
[data not shown]
* SSLv3, TLS handshake, Server key exchange (12):
[data not shown]
* SSLv2, Unknown (22):
[data not shown]
* SSLv3, TLS handshake, Server finished (14):
[data not shown]
* SSLv2, Unknown (22):
[data not shown]
* SSLv3, TLS handshake, Client key exchange (16):
[data not shown]
* SSLv2, Unknown (20):
[data not shown]
* SSLv3, TLS change cipher, Client hello (1):
[data not shown]
* SSLv2, Unknown (22):
[data not shown]
* SSLv3, TLS handshake, Finished (20):
[data not shown]
* SSLv2, Unknown (20):
[data not shown]
* SSLv3, TLS change cipher, Client hello (1):
[data not shown]
* SSLv2, Unknown (22):
[data not shown]
* SSLv3, TLS handshake, Finished (20):
[data not shown]
* SSL connection using TLSv1.2 / ECDHE-ECDSA-AES128-GCM-SHA256
* Server certificate:
* subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.google.com
* start date: 2017-11-29 09:44:32 GMT
* expire date: 2018-02-21 09:37:00 GMT
* subjectAltName: www.youtube.com matched
* issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
* SSL certificate verify ok.
* SSLv2, Unknown (23):
[data not shown]
> GET / HTTP/1.1
> User-Agent: curl/7.37.0
> Host: www.youtube.com
> Accept: */*
>
* SSLv2, Unknown (23):
[data not shown]
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< X-XSS-Protection: 1; mode=block; report=https://www.google.com/appserve/security-bugs/log/youtube
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
< Expires: Tue, 27 Apr 1971 19:44:06 EST
< Strict-Transport-Security: max-age=31536000
< P3P: CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=uk for more info."
< Cache-Control: no-cache
< Date: Tue, 26 Dec 2017 12:26:21 GMT
* Server YouTube Frontend Proxy is not blacklisted
< Server: YouTube Frontend Proxy
< Set-Cookie: YSC=lkUUrudTNJM; path=/; domain=.youtube.com; httponly
< Set-Cookie: PREF=f1=50000000; path=/; domain=.youtube.com; expires=Mon, 27-Aug-2018 00:19:21 GMT
< Set-Cookie: VISITOR_INFO1_LIVE=Qo2rlICrfJM; path=/; domain=.youtube.com; expires=Mon, 27-Aug-2018 00:19:21 GMT; httponly
< Alt-Svc: hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
[data not shown]
100 152 0 152 0 0 114 0 --:--:-- 0:00:01 --:--:-- 114* SSLv2, Unknown (23):
[data not shown]
* SSLv2, Unknown (23):
[data not shown]
* SSLv2, Unknown (23):
[data not shown]
* SSLv2, Unknown (23):
.......... many-other-same-not-interesting-rows .........
[data not shown]
* SSLv2, Unknown (23):
[data not shown]
100 425k 0 425k 0 0 113k 0 --:--:-- 0:00:03 --:--:-- 113k
* Connection #0 to host www.youtube.com left intact
见:
* 使用 TLSv1.2 / ECDHE-ECDSA-AES128-GCM-SHA256 的 SSL 连接
并使用:
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'ECDHE-ECDSA-AES128-GCM-SHA256');
【讨论】:
这是一个很好的建议,但通常目标站点可能不支持您的测试站点 (youtube.com) 使用的密码。【参考方案3】:以上都不适合我。我怀疑它与卷曲版本有关。 Curl_version();
返回 7.29,而我在服务器上安装了 7.49.1,这可能已经修复了这些 SSL 问题。
我突然想起了 Cloudflare 并禁用了 CDN 以防万一。卷曲开始工作。然后我切换到 PHP 7,Curl 甚至在 Cloudflare CDN 开启的情况下也开始工作。 Curl_version();
开始返回 7.49.1。
我不知道它是如何工作的以及究竟发生了什么,但经过数小时的不懈努力寻找解决方案,这就是我发现的。
【讨论】:
虽然这可能是有价值的信息,但它不是答案。 答案是:如果上述方法都不起作用,请检查 Curl 版本并进行更新。如果这个有价值的信息前天在这里,它会挽救我两天的生命。【参考方案4】:如果您在 CentOS 7 上并且在使用 yum 时遇到这些错误,更新 nss nss-util nss-sysinit nss-tools 将修复它。
【讨论】:
经过大约2小时的调试,在我的php页面设置了多个curl选项,你救了我。谢谢!如果您在 VPS 上并且 curl 命令行调用给出curl: (35) Cannot communicate securely with peer
错误,请尝试以上 yum update,应该会有所帮助。命令是:yum update nss nss-util nss-sysinit nss-tools
【参考方案5】:
服务器仅支持 ECC 密码 (ECDHE-*)。 curl 的版本是使用 Redhat/CentOS 上的 NSS 库构建的。有一个错误报告称 Redhat/CentOS 覆盖了 curl 设置和disables ECC ciphers by default。由于客户端不提供 ECC 密码,但服务器仅支持 ECC 密码,因此连接将失败。
您可以尝试明确给出密码,即
curl --ciphers ecdhe_rsa_aes_128_gcm_sha_256 ...
请注意,升级 OpenSSL 将无济于事,因为 curl 不是使用 OpenSSL 后端构建的。此外,禁用证书验证(无论如何都是坏主意)或更改根 CA 也无济于事,因为该问题根本与证书验证无关。
尝试以--ciphers ecdhe_ecdsa_aes_128_sha
明确给出密码作为解决问题的密码会朝着正确的方向发展,但在这种情况下将无济于事,因为这不是服务器支持的密码之一。服务器仅支持各种 ECDHE-RSA-* 密码,但不支持 ECDHE-ECDSA-* 密码。详情请见SSLLabs。
【讨论】:
感谢您的输入,对我来说理解密码非常重要,但我正在学习,到目前为止它在 shell 上工作,但是我如何在 php curl 请求中定义密码?谢谢 @AMB:如果您使用php.net/manual/en/function.curl-setopt.php 的文档,您会发现 CURLOPT_SSL_CIPHER_LIST 设置。 谢谢,固定代码和它的魅力。我真的很感激。, 对我来说 curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'ecdhe_rsa_aes_128_gcm_sha_256');工作,因为它是一个不同的洪流网站。以上是关于如何修复 curl:(35)无法与对等方安全通信:没有通用加密算法的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TLS/SSL 确保 WebSocket 连接的安全
安装 grunt 插件时如何修复需要 grunt@~0.4.0 的对等方?
Android:对于套接字,传递“对等方的证书与预期的主机名不匹配”错误的最安全方法?