【问题标题】:Java 8 SSLContext.getInstance("TLSv1.2") what does it mean?Java 8 SSLContext.getInstance("TLSv1.2") 是什么意思?
【发布时间】:2018-03-14 09:38:08
【问题描述】:

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

现在它又可以正常工作了,如果我没记错的话,它是用于安全通信,但是为什么 SSLexception 在 Linux env 上而不是在 Windows 上,SSLContext.getInstance("TLSv1.2") 将在所有环境中工作,为什么不是 TLSV1。 1 所有环境默认都是1.2或最新版本,如何确保它可以在所有环境上运行?

【问题讨论】:

    标签: java ssl ssl-certificate


    【解决方案1】:

    TLS 代表Transport Layer Security,它是替代安全套接字层 (SSL) 的标准。 v1.1 和 v1.2 被认为是安全的 TLS 版本很少(目前正在起草 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。

    【讨论】:

    • 解释得很好,谢谢 Karol :)
    • j6 的免费版本确实支持名为 TLSv1 的 TLSv1.0 (rfc2246)(即没有 .0),但 1.0 受到 BEAST 在 2011 年和现在推广的可预测 IV 攻击的影响经常使用(例如 PCI)作为禁止 1.0 的理由,即使它实际上通过记录拆分很快就得到了很好的缓解(包括 6u29 以上)。
    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2016-05-05
    相关资源
    最近更新 更多