默认情况下,使用Java8运行JavaJAR会强制TLS1.2吗?
我使用一个供应商提供给我的API编写了一个java应用程序,该API访问该供应商的webapp下载文件。供应商的webapp即将放弃对tls1.0/1.1的支持,我想验证我的应用程序是否将继续运行。该应用程序在安装了Java 8的CentOS服务器上运行,我一直在读Java 8默认支持TLS1.2,但我很好奇它是否真的强制应用程序使用TLS1.2,或者应用程序是否可以覆盖默认值。我确实在API的代码中看到了对TLSv1的引用 我认为除了要求供应商更新他们的API之外,我没有什么可以做的,但我只是想知道这是否有必要,或者我是否应该期望应用程序现在运行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之外,我没有什么可以做的,但我只是
//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(您没有),您可以使用sysprophttps.protocols
来更改它在j8中,默认值为“高达1.2”或syspropjdk.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将数据中继到真实主机。但我认为您不需要这样做。)