38

我正在尝试在我正在设置的 Java 客户端和服务器之间建立 SSL 或 TLS 连接。

我一直在使用它SSLContext.getInstance("SSL")来构建SSLContext,并且它有效。

我想知道protocol参数的用途是什么SSLContext.getInstance(String protocol)

特别是,使用SSLContext.getInstance("SSL")andSSLContext.getInstance("TLS")或其他可能的值之间有什么变化?

4

2 回答 2

34

这是我不久前写的一个相当详细的答案,描述了 SSL 和 TLS 之间的区别。简而言之,TLS 是 SSL 的继承者,TLS 1.0 可以认为是“SSL 3.1”。

如果您查看JSSE 参考指南,在 SSLContext 部分中,它说:

这些静态方法每个都返回一个实例,该实例至少实现了所请求的安全套接字协议。返回的实例也可以实现其他协议。例如,getInstance("TLSv1") 可能会返回实现“TLSv1”、“TLSv1.1”和“TLSv1.2”的实例。

标准名称文档中也提到了这一点。

特别是,如果您检查SSLContextImpl的 Oracle/OpenJDK 7 源代码,您会发现它的所有SSLContexts 都支持所有协议(从使用 SSLv2 Client Hello 的 SSLv3 到 TLS 1.2)。不同的是默认启用哪些协议。此外,一般情况下,您不应该依赖它,因为其他 Java 实现(例如 IBM JRE)的行为可能会有所不同。

如果您希望将一组特定的协议用于连接,您应该使用SSLSocketorSSLEnginesetEnabledProtocols方法。否则,它将使用默认值,如Providers 文档中所述。

于 2012-10-30T12:02:00.143 回答
1

协议用于服务器和客户端之间的通信。所以SSLContext(String protocol)返回协议的实例,然后使用该服务器或客户端相互通信以获得安全级别。

有关更多参考,请参阅此链接。 http://www.herongyang.com/JDK/SSL-java-net-ssl-SSLContext-Class-Test.html

于 2012-10-30T09:23:31.437 回答