编程语言
首页 > 编程语言> > java – SSLContext初始化

java – SSLContext初始化

作者:互联网

我正在查看JSSE参考指南,我需要获取SSLContext的实例才能创建SSLEngine,因此我可以将它与Netty一起使用以启用安全性.

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

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供应商不同.您当然应该选择一个至少支持您要使用的协议版本的程序.

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

作为一般规则,请使用最高版本号(SSLv3< TLSv1.0< TLSv1.1 ...),这可能取决于您要与之通信的各方支持的内容. 默认情况下启用哪些协议取决于Oracle JRE的确切版本. 在查看the source code for sun.security.ssl.SunJSSE in OpenJDK 7u40-b43时,就SSLContext协议而言,TLS只是TLSv1的别名(SSL和SSLv3也是如此).查看各种implementations of SSLContextImpl(这是SSLContextImpl本身的内部类):

>所有支持所有协议.
>默认情况下,在服务器端启用所有协议.
>默认启用的客户端协议有所不同:

> TLS10Context(用于协议SSL,SSLv3,TLS,TLSv1)默认在客户端启用SSLv3到TLSv1.0.
> TLS11Context(用于协议TLSv1.1)默认情况下也启用TLSv1.1.
> TLS12Context(用于协议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协议TLSv1,TLSv1.1和TLSv1.2也使用TLS10Context,TLS11Context和TLS12Context,它们遵循与Java 7中相同的逻辑.

但是,协议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.

如果此属性为空,则默认情况下在客户端和服务器端都启用所有协议.

当然,在recent versions of Oracle JRE 8, SSL is also completely disabled by default(从那些名单中删除).

请注意,在这两种情况下(JRE 7和8),默认情况下通过SSLContext.getDefault()获得的SSLContext开箱即用,或多或少等同于使用协议TLS获得的SSLContext,并使用默认的truststore参数进行初始化,依此类推.

标签:java,ssl,security,jsse
来源: https://codeday.me/bug/20190923/1815660.html