我们的应用程序已长期部署到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端发生了某些更改(基础架构或某些软件包)

最佳答案

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

如果您使用免费的CloudFlare计划,则仅支持ECC ciphers(ECDHE- *),即使用Elliptic Curve Cryptography的密码。如果您使用的是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客户。

关于java - curl:(35)无法与对等方安全地通信:没有通用的加密算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38460819/

10-12 05:00