Bru*_*uno 27
正如您在标准名称文档中所看到的,所有条目(SSLv3,TLSv1.0,TLSv1.1,...)都表示它们可能支持其他版本.
实际上,在Oracle JDK(和OpenJDK)中,他们都这样做.如果查看源代码,TLS10Context该类是用于TLS,SSL,SSLv3和TLS10的类,TLS11Context用于TLSv1.1和TLS12ContextTLSv1.2.所有版本都支持所有版本的SSL/TLS,默认情况下启用的内容会有所不同.
这可能与其他提供商或JRE供应商不同.您当然应该选择一个至少支持您要使用的协议版本的程序.
请注意,所使用的协议将在以后使用SSLSocket.setEnabledProtocols(...)或SSLEngine等效时确定.
作为一般规则,请使用最高版本号(SSLv3 <TLSv1.0 <TLSv1.1 ...),这可能取决于您要与之通信的各方支持的内容.
默认情况下启用哪些协议取决于Oracle JRE的确切版本.
在查看OpenJDK 7u40-b43 的源代码时sun.security.ssl.SunJSSE,就协议而言,TLS它只是TLSv1(以及是SSL和SSLv3)的别名SSLContext.查看(它们本身的内部类)的各种实现SSLContextImplSSLContextImpl:
TLS10Context(用于协议SSL,SSLv3,TLS,TLSv1)使的SSLv3到TLSv1.0默认客户端上.TLS11Context(用于协议TLSv1.1)默认情况下也启用TLSv1.1.TLS12Context(用于协议TLSv1.2)默认情况下也启用TLSv1.2.Java 8中的这一变化与新的jdk.tls.client.protocols系统属性一起发生了变化.
再次,在看时的源代码sun.security.ssl.SunJSSE中的OpenJDK 8u40-B25,SSLContext协议TLSv1,TLSv1.1以及TLSv1.2还利用TLS10Context,TLS11Context并且TLS12Context,其遵循相同的逻辑Java 7中.
但是,协议TLS不再是其中任何一个的别名.相反,它使用TLSContext依赖于jdk.tls.client.protocols系统属性中的值.来自JSSE参考指南:
要在客户端上启用特定的SunJSSE协议,请在引号内的逗号分隔列表中指定它们; 然后在客户端上禁用所有其他支持的协议.例如,如果此属性的值为"TLSv1,TLSv1.1",则在客户端上启用客户端上TLSv1和TLSv1.1的默认协议设置,同时禁用SSLv3,TLSv1.2和SSLv2Hello客户端.
如果此属性为空,则默认情况下在客户端和服务器端都启用所有协议.
当然,在最新版本的Oracle JRE 8中,默认情况下SSL也完全禁用(因此从这些列表中删除).
请注意,在这两种情况下(JRE 7和8),SSLContext默认情况下,您通过SSLContext.getDefault()开箱即可SSLContext获得的信息或多或少等同于使用协议获得TLS并使用默认信任库参数初始化,依此类推.