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

时间:2018-03-14 09:38:08

标签: java ssl ssl-certificate

我正在尝试为某个端点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"))

现在它再次运行正常,如果我没有错,它是用于安全通信,但那么为什么SSL上的SSLexception而不是Windows,SSLContext.getInstance("TLSv1.2")这将适用于所有环境,为什么不呢? TLSV1.1默认情况下所有环境都有1.2或最新版本,如何确保它可以在所有环境中运行?

1 个答案:

答案 0 :(得分:3)

TLS代表Transport Level Security,它是标准取代的安全套接字层(SSL)。有很少版本的TLS,其中v1.1和v1.2被认为是安全的(目前正在起草v1.3)。如果您不想使用最新的TLS版本深入了解技术细节,那么这是最好的选择。

这里很好地解释了Java中的TLSv1.2:JDK 8 will use TLS 1.2 as default。由于TLSv1.2是在JDK中实现的,因此它应该适用于所有操作系统。由于有多个JDK供应商(Oracle,OpenJDK,Azul等),您希望使用JDK对其进行测试。问题是旧版本,例如Oracle HotSpot Java 6仅支持SSL,除非您拥有高级Oracle维护版本或自定义库,否则您将无法获得TLS。