我们的应用程序已部署到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端(基础架构或某些软件包)已经更改的内容
答案 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客户。