SSLContext初始化

Mic*_*che 12 java security ssl jsse

我正在查看JSSE参考指南,我需要获取一个实例SSLContext才能创建一个SSLEngine,所以我可以使用它Netty来启用安全性.

为了获得一个实例SSLContext,我使用SSLContext.getInstance().我看到该方法被多次覆盖,因此我可以选择使用协议和安全提供程序.

在这里,我可以看到可以使用的算法列表.我应该使用哪种算法来实现安全通信?

此外,由于可以指定要使用的安全提供程序,我应该使用哪个提供程序?

谢谢

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(以及是SSLSSLv3)的别名SSLContext.查看(它们本身的内部类)的各种实现SSLContextImplSSLContextImpl:

  • 全部都支持所有协议.
  • 默认情况下,在服务器端启用所有协议.
  • 默认情况下启用的客户端协议有所不同:
    • TLS10Context(用于协议SSL,SSLv3,TLS,TLSv1)使的SSLv3到TLSv1.0默认客户端上.
    • TLS11Context(用于协议TLSv1.1)默认情况下也启用TLSv1.1.
    • TLS12Context(用于协议TLSv1.2)默认情况下也启用TLSv1.2.
  • 如果启用了FIPS,则不支持SSL(因此默认情况下不启用).

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并使用默认信任库参数初始化,依此类推.

  • 您能否就说出getInstance(“ SSL”)与getInstance(“ TLS”)或getInstance(“ TLSv1”)时发生的事情来重新措词?每种协议支持哪些协议?每个协议的默认协议是什么,以什么优先顺序排列?在这些方面,java文档非常不清楚。例如,它说选择“ TLSv1”可以使1.0、1.1和1.2可用。这是否意味着SSLv3不可用?如果选择“ TLS”会使SSLv3不可用怎么办? (2认同)
  • @KyleM 我添加了一些细节。选择较高版本的协议不会禁用较低版本的协议(除非您明确执行此操作)。然而,SSL 有一个例外,它在最近的版本中通常也被禁用。 (2认同)