默认情况下,Java8URL连接是否使用TLS?
我有一个关于HTTPS/TLS和Java8或更高版本的简短问题。 想象一下以下设置:默认情况下,Java8URL连接是否使用TLS?,java,security,https,Java,Security,Https,我有一个关于HTTPS/TLS和Java8或更高版本的简短问题。 想象一下以下设置: Version 1: URL myUrl = new URL("https://example.com/fileOfInterest"); URLConnection connection = myURL.openConnection(); InputStream iStream = connection.getInputStream(); 默认情况下,此连接是TLS加密的(包括受信任CA
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?或者我必须自己禁用它
如果您能澄清这一困惑,请提前感谢,我只是不想冒安全漏洞的风险;)
我有点困惑,因为版本2似乎对可能的HTTPS连接没有任何配置影响
但当然不是
HttpsURLConnection connection=(HttpsURLConnection)url.openConnection()代码>
此构造称为强制转换运算符:其形式为(someType)someExpression
它做3件完全不相关的事情。因此,不足为奇:它经常让java程序员感到困惑
这里使用的模式是“类型强制”模式:这是当parens中的类型不包含与表达式不同的泛型(它根本不包含任何泛型,所以请检查)并且不是基元(它不是,所以请检查)时得到的模式
此模式意味着,什么也不发生。代码几乎是一个完整的禁止操作。在运行时,如果表达式实际上是所述类型(结果证明它是一个HttpsURLConnection
),则不会发生任何事情。但是,如果不是,该代码将抛出ClassCastException
版本2没有抛出这个,因此证明它什么也没做。(当然,在编译时,它确实强制类型:编译器现在允许您调用只有HttpsURLConnection对该表达式具有的内容,而如果您不强制转换,编译器将拒绝编译。但是,这是编译时,当我说“它什么都不做”时,我指的是运行时发生的事情
假设它什么都不做,而且java是严格的动态分派(这意味着,getInputStream()
调用总是根据调用它的实例的实际情况“解析”到最具体的实现),这两个代码段是完全相等的,除非openConnection
调用不返回HttpsURLConnection
,在这种情况下,版本1工作,版本2抛出ClassCastException
这使我们得出以下结论:
这两件事在定义上是一样的,因此证明版本2不是“必要的”
尽管如此,从第二个版本将崩溃的意义上讲,第二个版本可以被认为是“更安全的”(尽管有一个完全不合适的异常;您应该捕获它并重新引用到更合适的版本,这表明如果URL不是https,您的代码被指定为中止),虽然它不适用于这里,当然:您的URL是基于https的
真的,整个API有点糟糕。因为,嗯,jdk11?在任何情况下都比jdk8更新,有一个新的,更好的HTTP客户机烘焙到java中
我有点困惑,因为版本2似乎对可能的HTTPS连接没有任何配置影响
但当然不是
HttpsURLConnection connection=(HttpsURLConnection)url.openConnection();
此构造称为强制转换运算符:其形式为(someType)someExpression
它做3件完全不相关的事情。因此,难怪它经常让java程序员感到困惑
这里使用的模式是“类型强制”模式:这是当parens中的类型不包含与表达式不同的泛型(它根本不包含任何泛型,所以请检查)并且不是基元(它不是,所以请检查)时得到的模式
此模式意味着,什么也不发生。代码几乎是一个完全的禁止操作。在运行时,如果表达式实际上是声明的类型(结果证明它是一个HttpsURLConnection
),那么什么也不会发生。但是,如果不是,该代码将抛出ClassCastException
版本2没有抛出这个,因此证明它什么也没做。(当然,在编译时,它确实强制类型:编译器现在允许您调用只有HttpsURLConnection对该表达式具有的内容,而如果您不强制转换,编译器将拒绝编译。但是,这是编译时,当我说“它什么都不做”时,我指的是运行时发生的事情
假设它什么都不做,而且java是严格的动态分派(这意味着,getInputStream()
调用总是根据调用它的实例的实际情况“解析”到最具体的实现),这两个代码段是完全相等的,除非openConnection
调用不返回HttpsURLConnection
,在这种情况下,版本1工作,版本2抛出ClassCastException
这使我们得出以下结论:
这两件事在定义上是一样的,因此证明版本2不是“必要的”
尽管如此,从第二个版本将崩溃的意义上讲,第二个版本可以被认为是“更安全的”(尽管有一个完全不合适的异常;您应该捕获它并重新引用到更合适的版本,这表明如果URL不是https,您的代码被指定为中止),虽然它不适用于这里,当然:您的URL是基于https的
真的,整个API