【问题标题】:Getting Could not generate DH keypair Exception获取无法生成 DH 密钥对异常
【发布时间】:2015-11-20 17:05:52
【问题描述】:

当 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 证书)?

提前致谢!

【问题讨论】:

    标签: java ssl openssl vcenter


    【解决方案1】:

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

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

    2. 解决方法是避免 DHE_anything 并使用 plain-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

      • http://www.bouncycastle.org/latest_releases.html下载bcprov-jdk15on-$version.jar并将其放入您的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 相关的部分,我(或者可能是其他人)可以更具体。

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

    【讨论】:

    • 感谢 Dave 的回答,但我们运气不好!第三种方法不适用于我的情况,因为我不允许修改 JRE 环境。我尝试生成 PEM 格式的证书和 RSA 密钥文件,但效果不佳。您对如何生成纯 RSA 密钥交换有任何指示吗(我在我的问题中分享了我的 openssl 命令)。我现在的 HTTPS 服务器是 NGINX。如果我在 HTTPS 模式下尝试与 tomcat 相同的操作,它的工作原理。 Vcenter 可以从 HTTPS tomcat 下载 zip 文件。
    • 在 (HTTPS) nginx 服务器配置上,我有以下配置 ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EDH+aRSA:EECDH:!RC4:!aNULL :!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
    • @Bhushan 正如我所说,它不在证书中;具有任何大小 DHE 参数的 DHE_RSA 使用 same RSA 证书和密钥。对于 nginx(和 tomcat),请参阅编辑。
    • 非常感谢戴夫,新的编辑真的很有帮助,现在一切正常!我是 SSL 的新手,所以不知道 SSL 中的角色 DH 密钥对。您的回答有助于理解。我更改了 nginx.conf 文件并将 ssl_dhparam 设置为 1024 dh 参数文件。我也尝试了第二种选择,将 ssl_ciphers 更改为默认值。这两种方法都有效。
    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2014-06-26
    • 2015-08-25
    • 2011-01-28
    相关资源
    最近更新 更多