如何强制 Java 服务器仅接受 tls 1.2 并拒绝 tls 1.0 和 tls 1.1 连接

2022-09-01 12:57:35

我有一个在Java 7上运行的HTTPS Web服务。我需要进行更改,以便此服务仅接受TLS1.2连接并拒绝SSL3,TLS1.0和TLS1.1。

我添加了以下Java参数,以便TLS1.2是最高优先级。

-Dhttps.protocols=TLSv1.2

但它也接受来自 Java 客户端的 TLS1.0 连接。如果客户端也在使用上述 Java 参数运行,则连接为 TLS1.2,但如果客户端在没有此参数的情况下运行,则连接为 TLS1.0。

我对文件夹中的文件进行了一些播放。java.securityjdk/jre/lib/security

我目前有以下禁用的算法:

jdk.certpath.disabledAlgorithms= MD2, MD4, MD5, SHA224, DSA, EC keySize < 256, RSA keySize < 2048, SHA1 keysize < 224
jdk.tls.disabledAlgorithms=DSA, DHE, EC keySize < 256, RSA keySize < 2048, SHA1 keysize < 224

我使用的是 Java 7 更新 79。我不倾向于拦截每个连接并检查TLS版本。

我的服务器证书是使用带有 RSA 算法的 MD5 生成的 2048 位。

如果禁用的算法列表有 RSA 代替 RSA 键大小 < 2048,我收到 with 错误消息:SSLHandShakeError

没有共同的密码套件。

我的测试程序正在从以下 URL 运行 HTTP 服务器:http://www.herongyang.com/JDK/HTTPS-HttpsEchoer-Better-HTTPS-Server.html

请帮助如何使java只接受TLS1.2连接。


答案 1

我为此找到了解决方案。我设置

jdk.tls.disabledAlgorithms= SSLv2Hello, SSLv3, TLSv1, TLSv1.1

在服务器上的文件中。jre/lib/security/java.security

设置此设置后,服务器仅接受 TLS1.2 连接并拒绝较低的安全协议版本。


答案 2

我也在文件中进行了相同的更改,但一些客户端仍然能够使用SSL协议调用我的服务。"/java/jdk1.7.0_79/jre/lib/security"-java.security

变化:

jdk.tls.disabledAlgorithms=SSL,SSLv2,SSLv3, TLSv1, TLSv1.1,MD5, SSLv3, DSA, RSA keySize < 2048