密钥交换是 DHE_RSA,这意味着 Diffie Hellman Ephemeral由 RSA 认证。DHE 密钥,甚至 DHE 参数,都不在证书中,证书是长期的(FSVO long)而不是短暂的。证书中的密钥是 RSA,Java 处理安全大小的 RSA 没有问题,如今已超过 1024,通常为 2048。
直接的解决方法是使用与旧的 Java 兼容的弱DH(E) 参数。可能有十几个或更多 SSL/TLS 服务器程序使用 OpenSSL,或者使用 PEM 格式文件作为证书和(RSA) 私钥。(许多软件使用或可以处理 PEM 的证书,但大多数 OpenSSL 为私钥这样做。)这些服务器程序中的许多允许配置 DH(E) 参数,但我所看到的所有这些都不同,而你没有t 识别您的。
一种解决方法是避免 DHE_anything 并使用纯 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 相关的部分,我(或者可能是其他人)可以更具体。
编辑服务器是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 行“服务器临时密钥”。