我正在尝试为某个端点 URL 调用 REST API,它在 java.net 的 URL 和执行相同的 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"))
现在它再次工作正常,如果我没记错的话它是为了安全通信,但是为什么 SSLexception 在 Linux env 上而不是在 Windows 上,SSLContext.getInstance("TLSv1.2")
这是否适用于所有环境,为什么 TLSV1.1 不是所有环境默认都有 1.2 或最新版本,我如何确保它能在所有环境上运行?
最佳答案
TLS 代表 Transport Layer 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。
关于Java 8 SSLContext.getInstance ("TLSv1.2")是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49274172/