在JSSE中禁用非DHE和非ECDHE密码

时间:2017-01-16 18:41:13

标签: java ssl encryption jsse winstone

我有一台Winstone服务器在Windows上使用Java 8运行Jenkins。我正在尝试确保如果客户端请求未能指定首选密码,则服务器首选Diffie-Hellman密码。与Tomcat不同,Winstone似乎没有办法指定一个密码列表来订购它们。所以,我试图禁用非DHE和非ECDHE密码。我已经能够通过指定最小密钥大小和删除MD2算法修改java.security文件的禁用算法列表来删除其中的一些,但不能禁用所有这些算法。 OpenSSL将剩余的不需要的密码算法识别为:

AES128-GCM-SHA256
AES128-SHA256  
AES128-SHA  
EDH-RSA-DES-CBC3-SHA 
DES-CBC3-SHA

在java.security文件中,我尝试过各种为AES,AES128,None,EDH和DES添加过滤器,但是当我向服务器发出请求时,这些算法仍然显示为启用。我还尝试在legacyAlgorithms之后删除条目。有谁知道哪些过滤器值会删除这些?

java.security片段:

jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3, RC4, SSLv2Hello, TLSv1, TLSv1.1
jdk.tls.legacyAlgorithms= \
    K_NULL, C_NULL, M_NULL, \
    DHE_DSS_EXPORT, DHE_RSA_EXPORT, DH_anon_EXPORT, DH_DSS_EXPORT, \
    DH_RSA_EXPORT, RSA_EXPORT, \
    DH_anon, ECDH_anon, \
    RC4_128, RC4_40, DES_CBC, DES40_CBC

1 个答案:

答案 0 :(得分:1)

java.policy没有做你描述的事情; java.security。但它只禁用或限制单个原语和AFAICT它不能将非PFS作为一个类禁用。

如果您(可以并且确实)向服务器提供 ECDSA证书(即具有ECC密钥和KU =签名的证书)而不是RSA证书,则只有ECDHE-ECDSA密码可以是与该证书谈判。如果您(也可以)代替 DSA证书,则只能与该证书协商DHE-DSS密码;这可能取决于您使用自己的CA或自签名(具有其优缺点),因为我没有找到任何颁发DSA证书的公共CA. Java8将DHE默认为1024位共享值,现在将其视为安全性的边界,但使用系统属性可以更改此值,请参阅How to expand DH key size to 2048 in java 8

PS:OpenSSL称之为&#39; EDH&#39;在RFC中是DHE,实际上是算法 DH,以及OpenSSL称之为DES-CBC3&#39;真的是{3DES | 3DES-EDE | DESEDE} -CBC;见Map SSL/TLS cipher suites and their OpenSSL equivalents