我有一个运行在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。
我在jdk/jre/lib/security文件夹中尝试了一些java.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版本。
我的服务器证书是使用MD5和RSA算法生成的2048位证书。
如果禁用算法列表中有RSA而不是RSA keySize < 2048,则会收到SSLHandShakeError
错误消息:
没有通用密码套件。
我的测试程序正在运行来自以下URL的HTTP服务器: http://www.herongyang.com/JDK/HTTPS-HttpsEchoer-Better-HTTPS-Server.html
请告诉我如何使Java只接受TLS1.2连接。
SSLContext.getInstance("TLSv1.2")
能用吗? - user5266804SSLContext.getInstance
方法基本上需要将SSL
或TLS
作为参数传入。我敢打赌,在底层,Sun 提供程序甚至不关心您传递了什么字符串:您始终会得到由 JSSE 提供的“TLS 引擎”。 - Christopher Schultzhtts.protocols
没有起作用,因为它(以及https.cipherSuites
)只影响使用HttpsURLConnection
的 出站 连接,而不影响入站连接或直接使用SSL[Server]Socket
或SSLEngine
。@ChristopherSchultz:JCA查找仅接受由提供程序预定义的字符串(忽略大小写),对于j7 JSSE来说,这些字符串是Default SSL SSLv3 TLS TLSv1 TLSv1.1 TLSv1.2
-- 后两个在初始启用的协议方面有所不同,但所有协议都使用相同的代码,并且可以启用任何实现协议的子集,除了disabledAlgorithms
secprop 中的那些。 - dave_thompson_085