Java 获取无法生成DH密钥对异常
当vCenter(5.5)尝试从https服务器下载zip文件时,我遇到了这个异常。VCenter server具有JRE 1.6.0.31。我知道Java1.6和1.7中存在与同一问题相关的bug。此异常是由Java 获取无法生成DH密钥对异常,java,ssl,openssl,vcenter,Java,Ssl,Openssl,Vcenter,当vCenter(5.5)尝试从https服务器下载zip文件时,我遇到了这个异常。VCenter server具有JRE 1.6.0.31。我知道Java1.6和1.7中存在与同一问题相关的bug。此异常是由java.security.invalidalgorithParameterException引起的:素数大小必须是64的倍数,并且只能在512到1024(包括)之间 我可以从https服务器更改SSL证书。我试图通过使用OpenSSL生成新证书来解决这个问题(OpenSSL req-ne
java.security.invalidalgorithParameterException引起的:素数大小必须是64的倍数,并且只能在512到1024(包括)之间
我可以从https服务器更改SSL证书。我试图通过使用OpenSSL生成新证书来解决这个问题(OpenSSL req-new-x509-newkey rsa:1024-days 365-out server.crt-extensions usr\u cert
)以及其他选择。我查看了sun.security.ssl.ClientHandshaker
code,有一个执行
以下代码行并生成异常
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证书)
提前谢谢 密钥交换是DHE_RSA,这意味着Diffie Hellman通过RSA的短暂身份验证。DHE密钥,甚至DHE参数,不在证书中,它是长期的(FSVO long),而不是短暂的。证书中的密钥是RSA,Java在处理安全大小的RSA时没有问题,目前的安全大小超过1024,传统上是2048
- 从下载
并将其放入您的bcprov-jdk15on-$version.jar
JRE/lib/ext
- 编辑
在提供者列表中添加一行,如JRE/lib/security/java.security
,其中N是下一个可用数字security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider
openssl dhparam 1024 >mydhfile
(或者,如果您确实需要,可以使用更小的DSA-1大小=512到1024,以及64的倍数,但您不需要,我也不建议使用小于1024的大小)
(2) 另外,要禁用DHE,请不要添加它,而是在ssl_密码字符串中至少添加一些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_和_AES*_CBC_SHA,但对于歇斯底里的理由,OpenSSL名称省略了RSA和CBC。)
Tomcat默认情况下使用Java(JSSE)处理HTTPS连接,但根据打包/安装的不同,通常可以使用APR(也称为“Tomcat native”)或“native”,实际上是OpenSSL。如果Tomcat/JSSE在JRE6或7上运行,它使用JRE6,7客户端可以处理的DHE大小768;如果在JRE8上运行,它的默认大小为1024,JRE6,7客户端可以处理该大小。我不知道Tomcat/APR使用了什么(并且不容易测试),但它很可能是1024或更少。如果您想找到并运行Tomcat/APR,并且openssl1.0.2可用,请使用
openssl s_客户端-连接主机:端口-tls1-密码EDH+AES
;连接时输入Q,返回;查看大约20条“服务器临时密钥”线路。密钥交换是DHE_RSA,这意味着Diffie Hellman是通过RSA认证的临时密钥。DHE密钥,甚至DHE参数,不在证书中,它是长期的(FSVO long),而不是短暂的。证书中的密钥是RSA,Java在处理安全大小的RSA时没有问题,目前的安全大小超过1024,传统上是2048