首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SSLContext初始化

SSLContext初始化
EN

Stack Overflow用户
提问于 2012-07-16 20:18:37
回答 2查看 51.9K关注 0票数 13

我正在看JSSE参考指南,我需要获得SSLContext的一个实例来创建一个SSLEngine,这样我就可以在Netty中使用它来启用安全性。

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

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

另外,既然可以指定要使用的安全提供程序,那么我应该使用哪个提供程序?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-16 22:02:38

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

实际上,在Oracle JDK (和OpenJDK)中,它们都是这样的。如果你看一下source codeTLS10Context类用于TLS,SSL,SSLv3和TLS10,TLS11Context用于TLSv1.1,TLS12Context用于TLSv1.2。都支持SSL/TLS的所有版本,这是默认情况下启用的不同。

对于其他提供商或JRE供应商,这可能会有所不同。当然,您应该选择一个至少支持您想要使用的协议版本的协议。

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

作为一般规则,使用您可以使用的最高版本号(SSLv3 < TLSv1.0

默认情况下启用的协议因Oracle JRE的确切版本而异。

在介绍the source code for sun.security.ssl.SunJSSE in OpenJDK 7u40-b43时,就TLSv1协议而言,TLS只是SSLContext的别名( SSLSSLv3也是如此)。看看各种implementations of SSLContextImpl (它们是SSLContextImpl本身的内部类):

所有协议都支持默认在服务器端启用所有protocols.

  • All协议。

  • 默认启用的客户端协议有:
  • TLS10Context (用于SSLSSLv3TLSTLSv1)默认情况下在客户端启用SSLv3到TLSv1.0 side.
    • TLS11Context (用于协议TLSv1.1)还启用default.
    • TLS12Context的TLSv1.1 (用于协议TLSv1.2)还启用default.

的TLSv1.2

  • 如果启用了FIPS,则不支持(因此默认情况下不启用)。

这一点在Java8中随着the new jdk.tls.client.protocols系统属性的变化而改变。

同样,在研究the source code for sun.security.ssl.SunJSSE in OpenJDK 8u40-b25时,SSLContext协议TLSv1TLSv1.1TLSv1.2也使用了TLS10ContextTLS11ContextTLS12Context,它们遵循与Java7中相同的逻辑。

但是,协议TLS不再是它们中任何一个的别名。相反,它使用依赖于jdk.tls.client.protocols系统属性中的值的TLSContext。从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中(因此从这些列表中删除)。

请注意,在这两种情况下(JRE7和8),默认情况下通过SSLContext.getDefault()获得的开箱即用的SSLContext或多或少等同于使用协议TLS获得的SSLContext,并使用默认的信任库参数等进行初始化。

票数 29
EN

Stack Overflow用户

发布于 2012-07-16 20:29:57

该协议没有默认值,所以我将使用您的JDK支持的最新版本,即TLSv1、TLSv1.1或TLSv1.2:看看哪个有效,或者看看getSupportedProtocols()。默认的安全提供者是通过避免您指定的所有API来使用的,否则就是KeyStore.getDefaultType()

在获取SSLEngines时,请确保使用接受主机名和端口的方法。否则,您将无法获得SSL会话共享。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11504173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档