【问题标题】:Is a Java 8 URL connection using TLS by default?Java 8 URL 连接是否默认使用 TLS?
【发布时间】:2021-04-06 01:19:13
【问题描述】:

我有一个关于 HTTPS/TLS 和 Java 8 或更高版本的简短问题。 想象一下以下设置:

Version 1:
URL myUrl = new URL("https://example.com/fileOfInterest");
URLConnection connection = myURL.openConnection();
InputStream iStream = connection.getInputStream();

此连接是默认加密的(包括受信任的 CA 的证书验证等)还是我必须遵循链接 here 暗示此配置的指南:

Version 2:
URL url = new URL("https://example.com/fileOfInterest");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
InputStream iStream = connections.getInputStream();

我有点困惑,因为第 2 版似乎对可能的 HTTPS 连接没有任何配置影响。

在默认情况下具有安全 HTTPS 连接的情况下,是否也禁止在无法通过 HTTPS 连接的情况下回退到不安全的 HTTP?还是我必须自己禁用它。

提前感谢您能澄清这种困惑,我只是不想冒安全漏洞的风险;)

【问题讨论】:

  • 如果您提供 https URL,您将获得 https 连接,根据定义,无论您使用什么类进行类型转换。如果您使用 Java 未知的协议,则会收到异常。

标签: java security https


【解决方案1】:

我有点困惑,因为第 2 版似乎对可能的 HTTPS 连接没有任何配置影响。

当然不是。

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();

这个构造称为cast operator:它采用(someType) someExpression的形式。

它做了 3 个完全不相关的事情。因此,难怪:它经常让 Java 程序员感到困惑。

您在这里使用的模式是“类型强制”模式:这是当括号中的类型不包含与表达式不同的泛型时获得的模式(它根本不包含任何泛型,所以,检查),并且不是原语(不是,所以检查)。

这种模式意味着,什么都不会发生。该代码几乎是完全无操作的。在运行时,如果表达式实际上是指定的类型(结果是HttpsURLConnection),那么什么都不会发生。但是,如果它不是 ,那么该代码将抛出 ClassCastException。

版本 2 没有抛出这个问题,因此证明 它什么也没做。 (在编译时,它当然会强制类型:编译器现在允许您调用只有 HttpsURLConnection 在此表达式上具有的内容,而如果您不强制转换,编译器将拒绝编译它。但是,那是编译时间,当我说“它什么都不做”时,我指的是运行时发生的事情。

鉴于它什么都不做,并且 java 是严格的动态调度(意思是,getInputStream() 调用总是“解析”到最具体的实现,具体取决于您实际调用它的实例),这 2 个 sn-ps完全相等,除非 openConnection 调用不返回 HttpsURLConnection,在这种情况下,版本 1 有效,而版本 2 抛出 ClassCastException。

这使我们得出以下结论:

  1. 根据定义,这两件事做同样的事情,因此证明版本 2 不是“必要的”。

  2. 尽管如此,版本 2 可以被认为是“更安全”,因为第二个版本会崩溃(尽管有一个完全不适当的异常;您应该抓住它并重新抛出更合适的东西 - 表明您的代码是指定的事实如果 URL 不是 https,则中止),当然它不适用于此处:您的 URL IS 基于 https。

  3. 真的,整个 API 有点糟糕。因为,嗯,jdk11?在任何情况下都比 jdk8 更新,有一个新的、更好的 HTTP 客户端嵌入到 java 中。 I suggest you use that one.

【讨论】:

  • 谢谢,这对我来说更准确。但是关于 TLS 的事情,你知道 Java 是否在提供 https URL 的同时建立了 HTTPS 连接吗?
  • 。是的,确实如此。
猜你喜欢
  • 2013-12-25
  • 2016-04-27
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多