2015-07-20 122 views
0

单独的JDK/JRE版本是否确定SSLSocket.getSupportedProtocols()的结果?或者还有其他可以影响这个结果的配置/启动参数吗?例如,如果应用程序在JDK 1.7 update 21上运行,则此方法将返回[SSLv2Hello,SSLv3,TLSv1,TLSv1.1,TLSv1.2]。但是,如果应用程序在不支持SSLv3的JDK 1.8上运行,该方法是否仅返回[TLSv1,TLSv1.1,TLSv1.2]?单独的JDK/JRE版本是否确定SSLSocket.getSupportedProtocols()的结果?

我假设这个问题的答案也适用于默认的启用列表。例如,在JDK 1.7 update 21中,SSLSocket.getEnabledProtocols()默认返回[SSLv3,TLSv1]。所以对于JDK 1.8,默认启用列表是[TLSv1.1,TLSv1.2]?

回答

2

此前的Java 7,你刚jdk.certpath.disabledAlgorithms禁用算法。

从更高版本的Java 7开始,您也有jdk.tls.disabledAlgorithms。两者之间的区别似乎是jdk.tls.disabledAlgorithms也可以限制TLS/SSL版本。

jdk.tls.legacyAlgorithms也存在。此列表中的协议仅在所有其他允许的协议被拒绝后才会使用。

在Java 8u51,这些默认值(在Java的lib/security/java.security文件中)是:

jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024 

jdk.tls.disabledAlgorithms=SSLv3, DH keySize < 768 

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 
+2

在一个侧面说明,的SSLv2是较新的Java版本中完全删除,不能使用,因此为什么它不” t出现在'jdk.tls.disabledAlgorithms'列表中。 – Powerlord

+0

配置在这个java.security文件中启用/禁用SSL/TLS协议是否正常?或者我应该在客户端代码中处理这个问题?也就是说,我将检索所有支持的协议,然后取出我不想要的那些(SSLv3,TLSv1),并将其余的setEnabled取出。 – Zoomzoom

+0

@Zoomzoom你可以真的做到这一点。我做了比其他任何事情都更多的Web开发,并且在那里只列出要使用的协议/密码是很平常的。 – Powerlord