我正在尝试在我正在设置的Java客户端和服务器之间建立SSL或TLS连接。
我一直在使用SSLContext.getInstance("SSL")
来构建SSLContext
,但它确实有效。
我想知道SSLContext.getInstance(String protocol)
中protocol
参数的用途是什么。
特别是,使用SSLContext.getInstance("SSL")
和SSLContext.getInstance("TLS")
或其他可能的值之间会发生什么变化?
答案 0 :(得分:32)
这是我写的一段rather detailed answer,后来描述了SSL和TLS之间的区别。简而言之,TLS是SSL的后继者,TLS 1.0可以被视为“SSL 3.1”。
如果你看JSSE Reference Guide, in the SSLContext section,就说:
这些静态方法每个都返回一个至少实现的实例 请求的安全套接字协议。返回的实例可能 实现其他协议。例如,getInstance(“TLSv1”)可以 返回实现“TLSv1”,“TLSv1.1”和“TLSv1.2”的实例。
Standard Names文档中也提到了这一点。
特别是,如果你检查SSLContextImpl的Oracle / OpenJDK 7源代码,你会发现它的所有SSLContext
都支持所有协议(从SSLv3使用SSLv2客户端Hello到TLS 1.2) )。不同之处在于默认启用哪些协议。此外,您通常不应该依赖于此,因为其他Java实现(例如IBM JRE)的行为可能不同。
如果您希望将一组特定协议用于连接,则应使用SSLSocket
或SSLEngine
的{{1}}方法。否则,它将使用默认值,如Providers documentation。
答案 1 :(得分:1)
协议用于服务器和客户端之间的通信。因此SSLContext(String protocol)
返回协议的实例,然后使用该服务器或客户端相互通信以获得安全级别。
有关更多参考,请参阅此链接。 http://www.herongyang.com/JDK/SSL-java-net-ssl-SSLContext-Class-Test.html