Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
默认情况下,使用Java8运行JavaJAR会强制TLS1.2吗?_Java_Tls1.2 - Fatal编程技术网

默认情况下,使用Java8运行JavaJAR会强制TLS1.2吗?

默认情况下,使用Java8运行JavaJAR会强制TLS1.2吗?,java,tls1.2,Java,Tls1.2,我使用一个供应商提供给我的API编写了一个java应用程序,该API访问该供应商的webapp下载文件。供应商的webapp即将放弃对tls1.0/1.1的支持,我想验证我的应用程序是否将继续运行。该应用程序在安装了Java 8的CentOS服务器上运行,我一直在读Java 8默认支持TLS1.2,但我很好奇它是否真的强制应用程序使用TLS1.2,或者应用程序是否可以覆盖默认值。我确实在API的代码中看到了对TLSv1的引用 我认为除了要求供应商更新他们的API之外,我没有什么可以做的,但我只是

我使用一个供应商提供给我的API编写了一个java应用程序,该API访问该供应商的webapp下载文件。供应商的webapp即将放弃对tls1.0/1.1的支持,我想验证我的应用程序是否将继续运行。该应用程序在安装了Java 8的CentOS服务器上运行,我一直在读Java 8默认支持TLS1.2,但我很好奇它是否真的强制应用程序使用TLS1.2,或者应用程序是否可以覆盖默认值。我确实在API的代码中看到了对TLSv1的引用

我认为除了要求供应商更新他们的API之外,我没有什么可以做的,但我只是想知道这是否有必要,或者我是否应该期望应用程序现在运行TLS1.2

//auth/AuthProxyClient.class

Socket socket = null;
        if (authProxySSLEnabled) {
            SSLSocketFactory factory = this.getSSLSocketFactory(authProxySSLTrustStore, authProxySSLTrustStorePassword, authProxySSLKeyStore, authProxySSLKeyStorePassword, authProxySSLClientAuth, authProxySSLKeyStoreClientKeyAlias, authProxySSLKeyStoreClientKeyPassword);
            socket = factory.createSocket(host, port);
            ((SSLSocket)socket).setEnabledProtocols(new String[]{"TLSv1"});
            ((SSLSocket)socket).setUseClientMode(true);
            ((SSLSocket)socket).startHandshake();
            this.logSSLSocketInfo((SSLSocket)socket);
        } else {
            socket = new Socket(host, port);
        }

//

try {
            SSLContext sslContext = SSLContext.getInstance("TLSv1");
            sslContext.init(keyManagers, trustManagers, (SecureRandom)null);
            factory = sslContext.getSocketFactory();
            return factory;
        } catch (GeneralSecurityException var13) {
            this.logException(var13);
            throw new IllegalStateException(var13);
        }
我期望(希望)该应用程序将通过单独在Java 8中运行来利用TLS1.2,但我不知道是否是这样。

TLDR:您需要启用它,但不要强制它,因为TLS版本是协商的

通过1.2,这相当简单。每个端点通常支持一系列版本,ClientHello(仅)指定客户端支持的最高版本。ServerHello以其支持的最高版本或客户端最大值(如果该版本较低)响应,但如果客户端最大值对于服务器太低(低于服务器最小值),则服务器将中止握手,如果服务器的选择对于客户端太低,则客户端将中止握手。1.3使这种协商更加复杂,但因为只有Java11Up支持1.3,所以我在这里忽略它

因此,只要客户机提供“最多”1.2版本,服务器就可以并且将选择1.2版本,它就会工作。客户机不需要主动阻止使用低于1.2的协议,但如果您愿意,也可以这样做

Java7和Java8之间的区别在于两者都实现了1.2,但是j7客户端默认只提供“最多”1.0。(由于SSL3现在被破坏和禁止,Java根本没有实现SSL2,“最多”1.0与“仅”1.0相同。)您可以在代码中覆盖此默认值,如果使用HttpsURLConnection(您没有),您可以使用sysprop
https.protocols
来更改它在j8中,默认值为“高达1.2”或sysprop
jdk.tls.client.protocols
,如Jonathan所述,但是可以像j7一样被覆盖

您发布的代码确实覆盖了它。该代码在j7或j8中只支持TLS 1.0,因此将被坚持1.2(甚至1.1)的服务器拒绝您需要更改代码,或者显式地允许1.2——这取决于您是否允许1.0和1.1,因为即使您这样做,服务器也不会选择它们——或者使用而不是覆盖适用于j8的默认值
SSLContext.getInstance(“TLS”)
获取两个Java版本中的(不同)默认值。(
SSLContext.getDefault()
也使用默认值,但这不允许您像代码那样直接自定义keymgr和trustmgr。)

(为了完整性:如果您不能或不能更改代码,一种解决方法是插入某种代理,一方面接受过时且令人讨厌的协议1.0,另一方面使用现在流行的protcol-1.2将数据中继到真实主机。但我认为您不需要这样做。)