默认情况下 Java 8 URL 连接是否使用 TLS?
Is a Java 8 URL connection using TLS by default?
我有一个关于 HTTPS/TLS 和 Java 8 或更高的简短问题。
想象以下设置:
Version 1:
URL myUrl = new URL("https://example.com/fileOfInterest");
URLConnection connection = myURL.openConnection();
InputStream iStream = connection.getInputStream();
此连接 TLS 是否默认加密(包括受信任的 CA 的证书验证等),或者我是否必须遵循链接的指南 暗示此配置:
Version 2:
URL url = new URL("https://example.com/fileOfInterest");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
InputStream iStream = connections.getInputStream();
我有点困惑,因为版本 2 似乎对可能的 HTTPS 连接没有任何配置影响。
如果默认使用安全的 HTTPS 连接,是否也禁止在无法通过 HTTPS 连接的情况下回退到不安全的 HTTP?还是我必须自己禁用它。
提前致谢,如果您能澄清这个困惑,我只是不想冒安全漏洞的风险;)
I am a little bit confused as Version 2 seems not to have any configurational effect on a possible HTTPS connection.
但当然不是。
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
此构造称为 cast 运算符:它采用 (someType) someExpression
的形式。
它做了 3 件 完全 无关的事情。因此,难怪:它经常让 java 程序员感到困惑。
您在此处使用的模式是 'type coercion' 模式:这是当括号中的类型不包含不同于表达式的泛型(它不包含任何泛型all, so, check), 并且不是原语 (不是, 所以check).
此模式意味着,什么都不会发生。该代码几乎是一个完整的空操作。在运行时,如果表达式实际上是声明的类型(事实证明它是 HttpsURLConnection
),那么什么也不会发生。但是,如果 不是 ,该代码将抛出 ClassCastException。
版本 2 不会抛出该错误,从而证明它什么也没做。 (当然,在编译时,它确实会强制转换类型:编译器现在允许您调用只有 HttpsURLConnection 在此表达式上具有的内容,而如果您不强制转换,编译器将拒绝编译它. 但是,那是编译时间,当我说 'it does nothing' 时,我说的是运行时发生的事情。
鉴于它什么都不做,并且鉴于 java 是严格的动态调度(意思是,getInputStream()
调用总是 'resolved' 到基于实例的最具体的实现你实际上是在调用它),这两个片段 完全相等 ,除非 openConnection
调用不 return HttpsURLConnection
,在这种情况下,版本 1 有效,而版本 2 抛出 ClassCastException。
这使我们得出以下结论:
根据定义,这两件事做同样的事情,因此证明版本 2 不是 'neccessary'。
然而,版本 2 可以被认为是 'safer',因为第二个版本会崩溃(但是,有一个完全不合适的异常;你应该抓住它并重新抛出到更合适的东西- 表明如果 URL 不是 https),你的代码被指定为中止这一事实,当然它不适用于这里:你的 URL IS 基于 https。
真的,整个 API 有点糟透了。因为,嗯,jdk11?在任何情况下都比 jdk8 更新,java 中加入了一个新的、更好的 HTTP 客户端。 I suggest you use that one.
我有一个关于 HTTPS/TLS 和 Java 8 或更高的简短问题。 想象以下设置:
Version 1:
URL myUrl = new URL("https://example.com/fileOfInterest");
URLConnection connection = myURL.openConnection();
InputStream iStream = connection.getInputStream();
此连接 TLS 是否默认加密(包括受信任的 CA 的证书验证等),或者我是否必须遵循链接的指南
Version 2:
URL url = new URL("https://example.com/fileOfInterest");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
InputStream iStream = connections.getInputStream();
我有点困惑,因为版本 2 似乎对可能的 HTTPS 连接没有任何配置影响。
如果默认使用安全的 HTTPS 连接,是否也禁止在无法通过 HTTPS 连接的情况下回退到不安全的 HTTP?还是我必须自己禁用它。
提前致谢,如果您能澄清这个困惑,我只是不想冒安全漏洞的风险;)
I am a little bit confused as Version 2 seems not to have any configurational effect on a possible HTTPS connection.
但当然不是。
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
此构造称为 cast 运算符:它采用 (someType) someExpression
的形式。
它做了 3 件 完全 无关的事情。因此,难怪:它经常让 java 程序员感到困惑。
您在此处使用的模式是 'type coercion' 模式:这是当括号中的类型不包含不同于表达式的泛型(它不包含任何泛型all, so, check), 并且不是原语 (不是, 所以check).
此模式意味着,什么都不会发生。该代码几乎是一个完整的空操作。在运行时,如果表达式实际上是声明的类型(事实证明它是 HttpsURLConnection
),那么什么也不会发生。但是,如果 不是 ,该代码将抛出 ClassCastException。
版本 2 不会抛出该错误,从而证明它什么也没做。 (当然,在编译时,它确实会强制转换类型:编译器现在允许您调用只有 HttpsURLConnection 在此表达式上具有的内容,而如果您不强制转换,编译器将拒绝编译它. 但是,那是编译时间,当我说 'it does nothing' 时,我说的是运行时发生的事情。
鉴于它什么都不做,并且鉴于 java 是严格的动态调度(意思是,getInputStream()
调用总是 'resolved' 到基于实例的最具体的实现你实际上是在调用它),这两个片段 完全相等 ,除非 openConnection
调用不 return HttpsURLConnection
,在这种情况下,版本 1 有效,而版本 2 抛出 ClassCastException。
这使我们得出以下结论:
根据定义,这两件事做同样的事情,因此证明版本 2 不是 'neccessary'。
然而,版本 2 可以被认为是 'safer',因为第二个版本会崩溃(但是,有一个完全不合适的异常;你应该抓住它并重新抛出到更合适的东西- 表明如果 URL 不是 https),你的代码被指定为中止这一事实,当然它不适用于这里:你的 URL IS 基于 https。
真的,整个 API 有点糟透了。因为,嗯,jdk11?在任何情况下都比 jdk8 更新,java 中加入了一个新的、更好的 HTTP 客户端。 I suggest you use that one.