Java 8 SSLContext.getInstance("TLSv1.2") 是什么意思?

4

我正在尝试调用一些终端点URL的REST API,对于java.net的URL来说运行得很好,在执行相同操作后。但是在某些机器上,由于SSLException而失败,因此代码被修改如下:

HttpsURLConnection connection = (HttpsURLConnection) new URL( url ).openConnection()

SSLContext sc = SSLContext.getInstance("TLSv1.2")
sc.init(null, null, new SecureRandom())
connection.setSSLSocketFactory(sc.getSocketFactory())
connection.setRequestProperty("charset", "utf-8")

InputStream input = connection.getInputStream()
InputStreamReader reader = new InputStreamReader(input, "utf-8")
BufferedReader buffer = new BufferedReader(reader)

buffer.lines().collect(Collectors.joining("\n"))

现在它再次正常工作,如果我没有理解错的话,这是为了安全通信,但是为什么在Linux环境中会出现SSL异常而不是Windows呢? SSLContext.getInstance(“ TLSv1.2”),这在所有环境中都有效吗?为什么不是TLSV1.1?所有环境默认都有1.2或更高版本吗?如何确保它将在所有环境中运行?
1个回答

6
TLS代表传输层安全性,它是取代安全套接字层(SSL)的标准。有几个版本的TLS,其中v1.1和v1.2被认为是安全的(目前正在制定v1.3)。如果您不想深入技术细节,使用最新的可用TLS版本是最好的选择。
在Java中,TLSv1.2的解释在这里:JDK 8将默认使用TLS 1.2。由于TLSv1.2在JDK内部实现,因此应该可以在所有操作系统上运行。由于有多个JDK供应商(Oracle,OpenJDK,Azul等),您需要使用您的JDK进行测试。要注意的是,旧版本(例如Oracle HotSpot Java 6)仅支持SSL,除非您拥有高级Oracle维护版本或自定义库,否则您将无法获得TLS。

非常好的解释。谢谢Karol :) - tyro
1
j6的免费版本支持TLSv1.0(rfc2246),名称为TLSv1(即没有.0),但1.0容易受到BEAST在2011年推广的可预测IV攻击,现在经常被用作禁止1.0的理由(例如PCI),尽管它实际上已经通过记录分割得到了很好的缓解(包括6u29)。 - dave_thompson_085

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接