2012-07-16 34 views
10

我在查看JSSE参考指南,我需要获得SSLContext的实例才能创建SSLEngine,所以我可以将其与Netty一起使用以启用安全性。SSLContext initialization

要获得SSLContext的实例,我使用SSLContext.getInstance()。我发现该方法被多次覆盖,所以我可以选择使用的协议和安全提供程序。

Here,我可以看到可以使用的算法列表。我应该使用哪种算法来启用安全通信?

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

感谢

回答

3

没有默认的协议,所以我会使用最新一个通过你的JDK的支持,要么是使用TLSv1,TLSv1.1或TLSv1.2工作:看看那个,或者看看在getSupportedProtocols()。使用默认安全提供程序是为了避免指定它的所有API,或者例如KeyStore.getDefaultType()

而当您开始获取SSLEngines时,请确保使用带有主机名和端口的方法。否则,您将不会获得SSL会话共享。

+0

嗨EJP,你的意思是使用'SSLContext.getDefault()'?另外,什么是默认值? – 2012-07-16 12:44:27

+0

@MickaelMarrache请参阅编辑。 – EJP 2012-07-16 23:56:53

21

正如您在standard names documentation中看到的,所有条目(SSLv3,TLSv1.0,TLSv1.1,...)都表示它们可能支持其他版本。

实际上,在Oracle JDK(和OpenJDK)中,他们都这么做。如果您查看source code,TLS10Context类是用于TLS,SSL,SSLv3和TLS10的类,则TLS11Context用于TLSv1.1的TLSv1.1和TLS12Context。全部支持SSL/TLS的所有版本,默认情况下启用的功能有所不同。

这可能与另一个提供商或JRE供应商不同。你当然应该选择一个至少支持你想要使用的协议版本。

请注意,所使用的协议是稍后使用SSLSocket.setEnabledProtocols(...)或其等效的SSLEngine确定的。

作为一般规则,请使用您可以使用的最高版本号(SSLv3 < TLSv1.0 < TLSv1.1 ...),这可能取决于您希望与之通信的各方支持的内容。


默认启用哪些协议取决于Oracle JRE的确切版本。

the source code for sun.security.ssl.SunJSSE in OpenJDK 7u40-b43看,TLS是简单地为TLSv1一个别名(等等都是SSLSSLv3),在SSLContext协议条款。看看各种implementations of SSLContextImpl(它们是SSLContextImpl本身的内部类):

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

Java 8中的此更改以及the new jdk.tls.client.protocols系统属性。

同样,在the source code for sun.security.ssl.SunJSSE in OpenJDK 8u40-b25看时,SSLContext协议TLSv1TLSv1.1,以及​​还利用TLS10ContextTLS11ContextTLS12Context,其遵循相同的逻辑用Java 7.

然而,协议TLS不再别名对他们中的任何一个。相反,它使用TLSContext,它依赖于jdk.tls.client.protocols系统属性中的值。从JSSE Reference guide

要启用客户端上的特定SunJSSE协议,在引号内的逗号分隔列表指定它们;然后在客户端上禁用所有其他支持的协议。例如,如果此属性的值为“TLSv1,TLSv1.1”,则在客户端上启用客户端上用于TLSv1和TLSv1.1的默认协议设置,而禁用SSLv3,TLSv1.2和SSLv2Hello客户端。

如果此属性为空,则客户端和服务器端均默认启用所有协议。

当然,在recent versions of Oracle JRE 8, SSL is also completely disabled by default(如此从列表中删除)。

注意,在这两种情况下(JRE 7和8),所述SSLContext你经由SSLContext.getDefault()默认得到开箱与协议TLS或多或少相当于SSLContext获得并使用默认信任存储参数等初始化。

+0

当您说getInstance(“SSL”)与getInstance(“TLS”)或getInstance(“TLSv1”)时会发生什么?每个协议支持哪些协议?每个协议的默认协议是什么以及优先顺序是什么? java文档在这些方面是非常不清楚的。例如它说选择“TLSv1”可能会使1.0,1.1和1.2可用。这是否意味着SSLv3不可用?如果您选择“TLS”,那么SSLv3将无法使用? – KyleM 2015-07-31 20:02:29

+1

@KyleM我已经添加了一些细节。选择较高版本的协议不会禁用较低版本的协议(除非明确执行)。但是,SSL有一个例外,在最近的版本中通常也禁用SSL。 – Bruno 2015-07-31 21:13:21

+0

@KyleM你真的应该有一个问题每个线程...这个答案/线程是从2012年开始 – eis 2015-07-31 21:50:07

相关问题