1

我有一个 Winstone 服务器在 Windows 上使用 Java 8 运行 Jenkins。我试图确保如果客户端请求未能指定首选密码,则服务器首选 Diffie-Hellman 密码。与 Tomcat 不同,Winstone 似乎没有办法指定密码列表来对它们进行排序。所以,我正在尝试禁用非 DHE 和非 ECDHE 密码。我已经能够通过修改 java.security 文件的禁用算法列表来删除其中的一些,方法是指定最小密钥大小并删除 MD2 算法,但不能禁用所有这些算法。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
4

1 回答 1

1

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

如果您(可以并且确实)给服务器一个ECDSA 证书(即带有 ECC 密钥和 KU=sign 的证书)而不是 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 所谓的“EDH”是 RFC 中的 DHE,实际上是算法DH,而 OpenSSL 所谓的“DES-CBC3”实际上是 {3DES|3DES-EDE|DESEDE}-CBC; 请参阅映射 SSL/TLS 密码套件及其 OpenSSL 等效项

于 2017-01-16T21:06:49.097 回答