0

当 vCenter(5.5) 尝试从 https 服务器下载 zip 文件时,我收到此异常。VCenter 服务器具有 JRE 1.6.0.31。我知道与 Java 1.6 和 1.7 中的相同问题相关的错误。此异常是由 java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive).

我可以从 https 服务器更改 SSL 证书。我尝试通过使用 OpenSSL ( openssl req -new -x509 -newkey rsa:1024 -days 365 -out server.crt -extensions usr_cert ) 和其他选项生成新证书来解决这个问题。我查看了sun.security.ssl.ClientHandshaker代码,有一个 switch case 执行以下代码行并生成异常。

case K_DHE_DSS:
case K_DHE_RSA:
    this.serverKeyExchange(new DH_ServerKeyExchange(input, serverKey,
    clnt_random.random_bytes, svr_random.random_bytes,messageLen));

有什么方法可以生成 SSL 证书来避免此代码执行(可能是没有 DH 密钥对的 SSL 证书)?

提前致谢!

4

1 回答 1

5

密钥交换是 DHE_RSA,这意味着 Diffie Hellman Ephemeral由 RSA 认证。DHE 密钥,甚至 DHE 参数,都不在证书中,证书是长期的(FSVO long)而不是短暂的。证书中的密钥是 RSA,Java 处理安全大小的 RSA 没有问题,如今已超过 1024,通常为 2048。

  1. 直接的解决方法是使用与旧的 Java 兼容的弱DH(E) 参数。可能有十几个或更多 SSL/TLS 服务器程序使用 OpenSSL,或者使用 PEM 格式文件作为证书(RSA) 私钥。(许多软件使用或可以处理 PEM 的证书,但大多数 OpenSSL 为私钥这样做。)这些服务器程序中的许多允许配置 DH(E) 参数,但我所看到的所有这些都不同,而你没有t 识别您的。

  2. 一种解决方法是避免 DHE_anything 并使用纯 RSA 密钥交换。包括 OpenSSL 在内的所有 SSL/TLS 实现都实现了这一点。但是,大多数应用程序和/或中间件不再喜欢它,有些甚至不允许它,因为它不提供Forward Secrecy。您如何控制密码套件以及密钥交换,同样取决于身份不明的服务器程序。

  3. 如果可以,更好的解决方法是启用ECDHE(特别是 ECDHE_RSA,因为您的证书/密钥是 RSA)。

    3A。Java6 JSSE 实现了 ECDHE 协议,但只有在您的 JRE 中存在 ECC 原语的 JCE“提供者”时才启用它们——并且交付的 Oracle/Sun JRE6(以及 TTBOMK 和 OpenJDK 之一)没有 ECC 提供者。将ECC 提供程序添加到 JRE6

    • bcprov-jdk15on-$version.jarhttp://www.bouncycastle.org/latest_releases.html下载并将其放入您的JRE/lib/ext

    • 编辑JRE/lib/security/java.security以在提供者列表中添加一行security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider,例如 N 是下一个可用数字。

    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:!aNU‌​LL:!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 行“服务器临时密钥”。

于 2015-08-26T19:33:27.167 回答