Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SSLContext初始化_Java_Security_Ssl_Jsse - Fatal编程技术网

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
      TLSv1
      )默认情况下在客户端启用SSLv3到TLSv1.0
    • TLS11Context
      (用于协议
      TLSv1.1
      )也默认启用TLSv1.1
    • TLS12Context
      (用于协议
      TLSv1.2
      )也默认启用TLSv1.2
  • 如果启用了FIPS,则不支持SSL(因此默认情况下不启用)
这将与系统属性一起在Java8中进行更改

同样,在查看时,
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中提供(扩展支持)