我正在查看 JSSE
引用指南,我需要获取 SSLContext
的实例才能创建 SSLEngine
,所以我可以将它与 Netty
一起使用以启用安全性。
要获取 SSLContext
的实例,我使用 SSLContext.getInstance()
。我看到该方法被多次重写,因此我可以选择要使用的协议(protocol)和安全提供程序。
Here ,我可以看到可以使用的算法列表。我应该使用哪种算法来实现安全通信?
此外,由于可以指定要使用的安全提供程序,我应该使用哪个提供程序?
谢谢
最佳答案
正如您在 standard names documentation 中看到的那样,所有条目(SSLv3、TLSv1.0、TLSv1.1、...)都表示它们可能支持其他版本。
实际上,在 Oracle JDK(和 OpenJDK)中,它们都是这样做的。如果您查看 source code ,TLS10Context
类用于 TLS、SSL、SSLv3 和 TLS10,TLS11Context
用于 TLSv1.1,TLS12Context
用于 TLSv1.2 .全部支持所有版本的 SSL/TLS,默认情况下启用的内容有所不同。
这可能与其他提供商或 JRE 供应商不同。您当然应该选择一个至少会支持您要使用的协议(protocol)版本的版本。
请注意,使用的协议(protocol)是稍后使用 SSLSocket.setEnabledProtocols(...)
确定的或其等效的 SSLEngine
。
作为一般规则,尽可能使用最高版本号(SSLv3 < TLSv1.0 < TLSv1.1 ...),这可能取决于您要与之通信的各方支持的内容。
默认启用哪些协议(protocol)取决于 Oracle JRE 的确切版本。
当查看 the source code for sun.security.ssl.SunJSSE
in OpenJDK 7u40-b43 时, TLS
只是 TLSv1
的别名(SSL
和 SSLv3
也是),就 SSLContext
协议(protocol)。看着各种implementations of SSLContextImpl
(它们是 SSLContextImpl
本身的内部类):
- 全部支持所有协议(protocol)。
- 默认情况下在服务器端启用所有协议(protocol)。
- 默认启用的客户端协议(protocol)各不相同:
TLS10Context
(用于协议(protocol)SSL
、SSLv3
、TLS
、TLSv1
) 默认在客户端启用 SSLv3 到 TLSv1.0。TLS11Context
(用于协议(protocol)TLSv1.1
)也默认启用 TLSv1.1。TLS12Context
(用于协议(protocol)TLSv1.2
)也默认启用 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
协议(protocol) TLSv1
、TLSv1.1
和 TLSv1.2
也使用了 TLS10Context
、TLS11Context
和 TLS12Context
,它们遵循与 Java 7 相同的逻辑。
但是,协议(protocol) TLS
不再是其中任何一个的别名。相反,它使用 TLSContext
它依赖于 jdk.tls.client.protocols
系统属性中的值。来自JSSE Reference guide :
To enable specific SunJSSE protocols on the client, specify them in a comma-separated list within quotation marks; all other supported protocols are then disabled on the client. For example, if the value of this property is "TLSv1,TLSv1.1", then the default protocol settings on the client for TLSv1 and TLSv1.1 are enabled on the client, while SSLv3, TLSv1.2, and SSLv2Hello are disabled on the client.
如果此属性为空,则默认情况下在客户端和服务器端启用所有协议(protocol)。
当然,在recent versions of Oracle JRE 8, SSL is also completely disabled by default (因此从这些列表中删除)。
请注意,在这两种情况下(JRE 7 和 8),您默认通过开箱即用的 SSLContext.getDefault()
获得的 SSLContext
或多或少是等效的到使用协议(protocol) TLS
获取的 SSLContext
并使用默认信任库参数等进行初始化。
关于java - SSLContext初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11504173/