curl:(35)无法与对等方安全通信:没有通用的加密算法

时间:2016-07-19 14:04:28

标签: java amazon-web-services https cloudflare openjdk

我们的应用程序已部署到AWS基础架构很长一段时间。

我们正在使用ClaudFlare进行缓存和CDN。 我们有两个应用程序 - Java(Tomcat 8)和WordPress(PHP Nginx + FastCGI)。

对于Java应用程序,我们将EC2实例与OpenJDK 8一起使用。另外,我们在另一个EC2实例上使用WordPress。

Java应用程序通过直接调用https协议与WordPress通信。

我们使用Puppet进行AWS基础架构配置。

一切正常但几天前我们的Java应用程序无法通过https连接到WordPress,但有以下异常:

Received fatal alert: handshake_failure
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

另外,我们无法通过curl连接到同一个WordPress网址,但出现以下错误:

curl: (35) Cannot communicate securely with peer: no common encryption algorithm(s).

这很奇怪,因为我们身边一切都没有改变。

仅仅是为了实验 - 我们禁用了ClaudFlare,我们的系统开始正常运行。在那之后我们启用了ClaudFlare并且系统再次失败。

只有从OpenJDK切换到OracleJDK才能完全解决问题。

CloudFlare告诉我们,他们最终没有改变SSL。

所以我想知道这个问题的原因是什么?可能是AWS端(基础架构或某些软件包)已经更改的内容

1 个答案:

答案 0 :(得分:2)

您需要支持CloudFlare密码套件; CloudFlare仅支持TLS协议,除此之外,它们仅支持安全密码。如果它不支持CloudFlare使用的任何密码,您可能必须在客户端更新OpenSSL的版本。

如果您使用的是免费的CloudFlare计划,则只会使用ECC ciphers支持Elliptic Curve Cryptography(ECDHE- *)密码。如果您使用Free CloudFlare计划,则需要确保您的客户及其操作系统支持椭圆曲线加密。

Nginx SSL configuration的结果如下:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;

更不可能的问题可能是您的客户端不支持SNI浏览器。 CloudFlare发布免费SSL证书需要SNI support(服务器名称指示);确保您的Java版本支持它。如果您不想这样做,付费的CloudFlare计划将支持非SNI客户。