我正在查看JSSE
参考指南,我需要获取一个实例SSLContext
才能创建一个SSLEngine
,所以我可以使用它Netty
来启用安全性。
要获得 的实例SSLContext
,我使用SSLContext.getInstance()
. 我看到该方法被多次覆盖,因此我可以选择要使用的协议和安全提供程序。
在这里,我可以看到可以使用的算法列表。我应该使用哪种算法来启用安全通信?
此外,由于可以指定要使用的安全提供程序,我应该使用哪个提供程序?
谢谢
正如您在标准名称文档中看到的那样,所有条目(SSLv3、TLSv1.0、TLSv1.1、...)都表示它们可能支持其他版本。
实际上,在 Oracle JDK(和 OpenJDK)中,它们都可以。如果查看源代码,TLS10Context
该类用于 TLS、SSL、SSLv3 和 TLS10,TLS11Context
用于 TLSv1.1 和TLS12Context
TLSv1.2。都支持所有版本的 SSL/TLS,默认情况下启用的内容会有所不同。
这可能与其他提供商或 JRE 供应商不同。您当然应该选择一个至少要支持您要使用的协议版本的协议。
请注意,使用的协议是稍后使用SSLSocket.setEnabledProtocols(...)
或SSLEngine
等效的。
作为一般规则,请使用您可以使用的最高版本号(SSLv3 < TLSv1.0 < TLSv1.1 ...),这可能取决于您要与之通信的各方支持什么。
默认启用哪些协议取决于 Oracle JRE 的确切版本。
在查看OpenJDK 7u40-b43的源代码时sun.security.ssl.SunJSSE
,就协议而言,TLS
它只是一个别名TLSv1
(and 也是SSL
如此SSLv3
)SSLContext
。查看(它们本身的内部类)的各种实现SSLContextImpl
SSLContextImpl
:
TLS10Context
(用于协议SSL
、、、、SSLv3
)默认情况TLS
下TLSv1
在客户端启用 SSLv3 到 TLSv1.0。TLS11Context
(用于协议TLSv1.1
)默认情况下也启用 TLSv1.1。TLS12Context
(用于协议TLSv1.2
)也默认启用 TLSv1.2。这在 Java 8 中与新的jdk.tls.client.protocols
系统属性一起发生了变化。
同样,在查看OpenJDK 8u40-b25中的源代码sun.security.ssl.SunJSSE
时,SSLContext
protocols TLSv1
,TLSv1.1
和TLSv1.2
还使用了TLS10Context
, TLS11Context
and 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(因此从这些列表中删除)。
Note that in both cases (JRE 7 and 8), the SSLContext
you get by default via SSLContext.getDefault()
out of the box is more or less equivalent to an SSLContext
obtained with protocol TLS
and initialised with the default truststore parameters and so on.
该协议没有默认值,因此我将使用您的 JDK 支持的最新协议,即 TLSv1、TLSv1.1 或 TLSv1.2:看看哪个有效,或者查看getSupportedProtocols()
. 默认安全提供程序通过避免您指定它的所有 API 来使用,或者例如KeyStore.getDefaultType()
.
当您获取 SSLEngines 时,请确保使用带有主机名和端口的方法。否则,您将无法获得 SSL 会话共享。