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

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

我们的应用程序长期部署到 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 url,出现以下错误:

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-*), ciphers using Elliptic Curve Cryptography。如果您使用免费的 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 客户端。