java - SSLContext初始化

标签 java security ssl jsse

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

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

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

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

谢谢

最佳答案

正如您在 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 供应商不同。您当然应该选择一个至少会支持您要使用的协议(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 的别名(SSLSSLv3 也是),就 SSLContext 协议(protocol)。看着各种implementations of SSLContextImpl (它们是 SSLContextImpl 本身的内部类):

  • 全部支持所有协议(protocol)。
  • 默认情况下在服务器端启用所有协议(protocol)。
  • 默认启用的客户端协议(protocol)各不相同:
    • TLS10Context(用于协议(protocol) SSLSSLv3TLSTLSv1 ) 默认在客户端启用 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) TLSv1TLSv1.1TLSv1.2 也使用了 TLS10ContextTLS11ContextTLS12Context,它们遵循与 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/

相关文章:

security - 隐藏 oauth secret

ios - 从 iOS 中的 kSecAttrApplicationTag 中提取模数

java - System.err﹕javax.net.ssl.SSLPeerUnverifiedException : No peer certificate

c++ - 使用 C++ 和 CryptoApi/SChannel 从 SChannel 中提取证书链

java - getSupportedCipherSuites 与 getDefaultCipherSuites Apache CXF

java - 如何将文件从 Dos 转换为 Unix

java - 是否可以从 JSP 下载二进制文件?

java - 在 Java 中将 Firestore 中的字符串保存到 ArrayList 中

c# - WebClient 无法从本地主机下载字符串

linux - 如何向自签名 CA 证书文件添加注释?