Java SSLContext初始化
我正在阅读Java SSLContext初始化,java,security,ssl,jsse,Java,Security,Ssl,Jsse,我正在阅读JSSE参考指南,我需要获得SSLContext的一个实例,以便创建SSLEngine,这样我就可以将它与Netty一起使用以启用安全性 要获取SSLContext的实例,我使用SSLContext.getInstance()。我看到该方法被多次重写,因此我可以选择要使用的协议和安全提供程序 ,我可以看到可以使用的算法列表。我应该使用哪种算法来实现安全通信 另外,由于可以指定要使用的安全提供程序,我应该使用哪个提供程序 谢谢该协议没有默认值,因此我将使用JDK支持的最新协议,即TLSv
JSSE
参考指南,我需要获得SSLContext
的一个实例,以便创建SSLEngine
,这样我就可以将它与Netty
一起使用以启用安全性
要获取SSLContext
的实例,我使用SSLContext.getInstance()
。我看到该方法被多次重写,因此我可以选择要使用的协议和安全提供程序
,我可以看到可以使用的算法列表。我应该使用哪种算法来实现安全通信
另外,由于可以指定要使用的安全提供程序,我应该使用哪个提供程序
谢谢该协议没有默认值,因此我将使用JDK支持的最新协议,即TLSv1、TLSv1.1或TLSv1.2:查看哪个有效,或者查看
getSupportedProtocols()
。默认安全提供程序的使用方法是避免使用指定它的所有API,否则,例如KeyStore.getDefaultType()
当您来获取SSLEngines时,请确保使用获取主机名和端口的方法。否则您将无法获得SSL会话共享。正如您在中看到的,所有条目(SSLv3、TLSv1.0、TLSv1.1等)都表示它们可能支持其他版本
实际上,在OracleJDK(和OpenJDK)中,它们都是这样做的。如果您查看,TLS、SSL、SSLv3和TLS10使用的是TLS10Context
类,TLS11Context
用于TLSv1.1,TLSv1.2使用的是TLS12Context
。都支持所有版本的SSL/TLS,默认情况下启用的内容会有所不同
这可能与其他提供商或JRE供应商不同。当然,您应该选择一个至少支持您想要使用的协议版本的协议
请注意,所使用的协议将在稍后使用或其SSLEngine
等效协议时确定
作为一般规则,请使用您可以使用的最高版本号(SSLv3默认情况下启用哪些协议取决于Oracle JRE的确切版本 查看时,
TLS
只是TLSv1
的别名(就SSLContext
协议而言,SSL
和SSLv3
)。查看各种(它们是SSLContextImpl
本身的内部类):
- 它们都支持所有协议
- 默认情况下,所有协议都在服务器端启用
- 默认情况下启用的客户端协议各不相同:
(用于协议TLS10Context
,SSL
,SSLv3
,TLS
)默认情况下在客户端启用SSLv3到TLSv1.0TLSv1
(用于协议TLS11Context
)也默认启用TLSv1.1TLSv1.1
(用于协议TLS12Context
)也默认启用TLSv1.2TLSv1.2
- 如果启用了FIPS,则不支持SSL(因此默认情况下不启用)
SSLContext
协议TLSv1
、TLSv1.1
和TLSv1.2
也使用了tls1context
、TLS11Context
和TLS12Context
,它们遵循与Java 7相同的逻辑
但是,协议
TLS
不再与它们中的任何一个有别名。相反,它使用依赖于jdk.tls.client.protocols
系统属性中的值的。从:
要在客户端上启用特定的SunJSSE协议,请在引号内的逗号分隔列表中指定它们;然后在客户端上禁用所有其他受支持的协议。例如,如果此属性的值为“TLSv1、TLSv1.1”,则在客户端上启用TLSv1和TLSv1.1的客户端默认协议设置,而在客户端上禁用SSLv3、TLSv1.2和SSLv2Hello
如果此属性为空,则默认情况下在客户端和服务器端启用所有协议
当然,在中(因此从这些列表中删除)
请注意,在这两种情况下(JRE 7和8),默认情况下通过
SSLContext.getDefault()
现成获得的SSLContext
或多或少等同于通过协议TLS
获得的SSLContext
,并使用默认的信任库参数进行初始化,依此类推。Hi EJP,您的意思是使用“SSLContext.getDefault()”吗?另外,默认值是什么?您是否可以根据getInstance(“SSL”)与getInstance(“TLS”)或getInstance(“TLSv1”)之间的对比来改写您的答案?每种协议都支持哪些协议?每个协议的默认协议是什么,优先级是什么?java文档在这些方面非常不清楚。例如,它说选择“TLSv1”可以使1.0、1.1和1.2可用。这是否意味着SSLv3不可用?如果选择“TLS”会导致SSLv3不可用吗?@KyleM我已经添加了一些细节。选择具有较高版本的协议不会禁用具有较低版本的协议(除非您明确这样做)。然而,SSL有一个例外,在最近的版本中,它通常也被禁用。@KyleM你真的应该每个线程有一个问题。。。这个答案/线索来自2012年anyway@eis不过,它或多或少也有同样的问题,不是吗?jdk.tls.client.protocols
也由Oracle在Java7u95中提供(扩展支持)