密钥交换是 DHE_RSA,这意味着 Diffie Hellman Ephemeral 已通过 RSA 身份验证。 DHE 密钥,甚至 DHE 参数,不在证书中,这是长期的(FSVO long)而不是短暂的。证书中的密钥是 RSA,Java 处理安全大小的 RSA 没有问题,如今已超过 1024,通常为 2048。
直接解决方法是使用与旧 Java 兼容的弱 DH(E) 参数。可能有十几个或更多 SSL/TLS 服务器程序使用 OpenSSL,或者使用 PEM 格式文件作为证书 和 (RSA) 私钥。 (很多软件使用或可以处理 cert 的 PEM,但大多数 OpenSSL 为私钥这样做。)其中许多服务器程序允许配置 DH(E) 参数,但我所看到的一切都如此不同,而且你不认同你的。
解决方法是避免 DHE_anything 并使用 plain-RSA 密钥交换。包括 OpenSSL 在内的所有 SSL/TLS 实现都实现了这一点。然而,大多数应用程序和/或中间件不再喜欢它,有些甚至不允许它,因为它不提供Forward Secrecy。您如何控制密码套件以及密钥交换,同样取决于身份不明的服务器程序。
-
如果可以,更好的解决方法是启用 ECDHE(特别是 ECDHE_RSA,因为您的证书/密钥是 RSA)。
3A。 Java6 JSSE 实现了 ECDHE 协议,但只有在您的 JRE 中有 ECC 原语的 JCE“提供程序”时才启用它们——并且交付的 Oracle/Sun JRE6(以及 TTBOMK 和 OpenJDK 之一)没有 ECC 提供程序。 添加 ECC 提供程序到 JRE6
JRE7 确实包含 ECC 提供程序,并且支持开箱即用的 ECDHE,如果这是一个选项的话。
3B。如果您的服务器使用 OpenSSL 1.0.0 或更高版本(某些较旧的 RedHat 版本除外),它会实现 ECDHE,但只有在 (1) 启用密码套件时才能使用,默认情况下是这样,但可以由服务器程序或其配置禁用,和 (2) 服务器程序设置 tmp_ecdh 参数(或在 1.0.2 中启用自动设置)。这两者都依赖于身份不明的服务器程序,如果服务器程序不使用 OpenSSL,答案可能会大不相同。
如果您确定您的服务器程序及其配置中与 SSL/TLS 相关的部分,我(或者可能是其他人)可以更具体。
EDIT 服务器是 nginx:
(1) nginx 应该可以使用 Java(6,7) 可以处理的 DHE 参数,参见http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_dhparam 并使用
创建文件
openssl dhparam 1024 >mydhfile
(或者如果你真的想要,更小的 DSA-1 大小 = 512 到 1024 和 64 的倍数,但你不需要,我不建议小于 1024)。
(2) 或者,要禁用 DHE,不要 添加它,但做 在 ssl_ciphers 字符串中添加至少一些 kRSA(或只是 RSA)。至少将评论中的字符串更改为
EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH:kRSA:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS
或者因为未修改的 JRE6 不会提供 ECDHE(或 TLSv1.2)并且我们没有添加任何需要删除的 PSK 或 SRP 或 DSS 或 aNULL,并且您不信任 3DES(为什么?)以及 RC4 和 Java没有实现 SEED 或 Camellia,您可以更简单地使用
AES128-SHA:AES256-SHA
(这些实际上是 TLS_RSA_WITH_AES*_CBC_SHA 但对于歇斯底里的葡萄干,OpenSSL 名称省略了 RSA 和 CBC。)
Tomcat 默认使用 Java (JSSE) 来处理 HTTPS 连接,但根据打包/安装的不同,通常可以使用 APR,也称为“Tomcat 本机”或只是“本机”,实际上是 OpenSSL。如果 Tomcat/JSSE 在 JRE6 或 7 上运行,它使用 JRE6,7 客户端可以处理的 DHE 大小 768;如果在 JRE8 上运行,它 默认 为 JRE6,7 客户端可以处理的大小 1024。我不知道 Tomcat/APR 使用什么(也不能轻易测试),但它很可能是 1024 或更少。如果你想知道并让 Tomcat/APR 运行并且 openssl 1.0.2 可用,请使用openssl s_client -connect host:port -tls1 -cipher EDH+AES;连接时输入Q,返回;并查找大约 20 行“服务器临时密钥”。