Java7 oracle不支持TLSv1.2
Java 7 oracle does not support TLSv1.2
Java 7 oracle不支持TLSv1.2。
我一直在尝试 运行 我的代码,并且尝试了以下操作:
System.setProperty("deployment.security.TLSv1.1", "false")
System.setProperty("deployment.security.TLSv1", "false")
System.setProperty("deployment.security.TLSv1.2", "true")
System.setProperty("https.protocols", "TLSv1.2")
System.setProperty("https.cipherSuites", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,AES_256_GCM,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384")
但这并没有帮助。
如何强制我的 Java7 应用程序使用 Tlsv1.2。我可以 运行 我的程序使用 java8 默认情况下使用 TLS1.2 并且一切正常。
如何从 oracle 在 Java7 中完成。
我也试过进入 /usr/lib/jvm/java-7-oracle/jre/lib/security
并禁用 jdk.tls.disabledAlgorithms=SSLv2Hello, SSLv3, TLSv1
但它仍然不起作用。
我哪里错了?
顺便说一句,我明白了 sslhandshakeexception-handshake-failure
编辑:
错误:
0000: 02 28 .(
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
166 [main] DEBUG org.apache.http.impl.conn.DefaultClientConnection - Connection org.apache.http.impl.conn.DefaultClientConnection@6b18e1c6 closed
166 [main] DEBUG org.apache.http.impl.conn.DefaultClientConnection - Connection org.apache.http.impl.conn.DefaultClientConnection@6b18e1c6 shut down
main, called close()
main, called closeInternal(true)
[main] DEBUG org.apache.http.impl.conn.BasicClientConnectionManager - Releasing connection org.apache.http.impl.conn.ManagedClientConnectionImpl@1f2dc289
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1979)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1086)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:533)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:401)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:214)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:160)
我 运行 遇到了同样的问题,并且由于我使用 Apache HTTP 客户端库发出请求,所以我通过这种方式初始化我的 HttpClient 解决了它
CloseableHttpClient client = HttpClients.custom()
.setSSLSocketFactory(getSSLContext())
.build();
其中 getSSLContext()
方法是这样的
private SSLConnectionSocketFactory getSSLContext() throws NoSuchAlgorithmException {
return new SSLConnectionSocketFactory(
SSLContext.getDefault(),
new String[]{"TLSv1.2"},
null,
new NoopHostnameVerifier());
}
如果有人遇到类似问题,我会回答我自己的问题:
我花了 2 天的时间尝试了所有的东西,最后我弄明白了。
在 Java-7-oracle
中无法使用 TLS1.2。即使使用系统属性配置它或什至在 SSLContext 级别设置也没有帮助我。他们的支持非常糟糕。虽然在Java-8-oracle
,这是可能的。
只需将我的 java 更改为 java-7-openjdk-amd64
就可以了。
您可以将 Java 7 版本升级到 1.7。0_131-b31
对于 JRE 1.7。0_131-b31 在 Oracle 站点中:
TLSv1.2 and TLSv1.1 are now enabled by default on the TLS client
end-points. This is similar behavior to what already happens in JDK 8
releases.
我有类似的问题,无法在 Java JDK 1.7 中启用 TLSv1.2。0_80 在 WebLogic 10.3 中,我们将其升级到 JDK 1.7。0_181,它开始为我们工作。
我遇到了类似的问题,需要好几天才能解决所有问题。我无法更新我的 JRE 版本,因为它在 HSM 上 运行ning。也许除了我还有其他人有这样的要求。
给出:
- JRE 1.7.0_25
- TOMCAT 8.0.9
要求:Tomcat 上的 Web 应用 运行ning 应该能够通过 TLSv1.2 连接到套接字。
问题 1:
JRE 1.7.0_25 无法通过 TLSv1.2 自行连接到套接字。
解法:
使用 BouncyCastle 库来实现:https://www.bouncycastle.org
问题2(解决这个问题需要好几天):
BouncyCastle 已激活并首先添加到安全提供程序,但在创建 SSLContext 和其他实例(Certificat、KeyStore、TrustManager)时仍未使用。
解法:
通过以下代码在 JSSE 中强制使用 BouncyCastle 作为安全机制:
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.insertProviderAt(new BouncyCastleJsseProvider(provider), 1);
Security.insertProviderAt(provider, 2);
而不是:
Security.insertProviderAt(new BouncyCastleProvider(), 2);
Security.insertProviderAt(new BouncyCastleJsseProvider(), 1);
但这将我引向下一个问题:
问题三:
java.lang.SecurityException: JCE 无法验证提供者 BC
解法:
BouncyCastle 的最新 jar (bcprov-jdk15on-162.jar) 以及之前的 (bcprov-jdk15on-161.jar) 没有为 1.7 正确签名。0_25,但是 bcprov-jdk15on-160.jar 是。使用版本 160 后,我终于能够使用以下代码通过 TLSv1.2 连接到套接字:
private static SSLContext createSSLContextBouncy(String base64Cert) {
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.insertProviderAt(new BouncyCastleJsseProvider(provider), 1);
Security.insertProviderAt(provider, 2);
LOGGER.debug("Using bouncy castle as security provider");
try {
byte[] certBytes = Base64.decodeBase64(base64Cert);
X509Certificate cert =
(X509Certificate) CertificateFactory.getInstance("X.509", "BC").generateCertificate(new ByteArrayInputStream(certBytes));
KeyStore keystore = KeyStore.getInstance("BKS", "BC");
keystore.load(null);
keystore.setCertificateEntry("alias", cert);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX", "BCJSSE");
trustManagerFactory.init(keystore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
SSLContext sslContext = SSLContext.getInstance("TLS", "BCJSSE");
sslContext.init(null, trustManagers, new SecureRandom());
return sslContext;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
不幸的是,它仍然无法在 Tomcat 中工作。
问题四:
当我 运行 代码作为 webapp(在 Tomcat 上)时,与 TLSv1.2 的连接仍然不起作用。握手开始但结束时出现错误 "connection refused".
解法:
HSM 上的 Tomcat 版本 运行ning(也许其他人也)出于任何原因需要 30 秒的握手时间,但端点有 10 秒的超时时间。我测试了另一个版本的 Tomcat(8.0.37,因为我们有 HSM 可能支持它的信息)并且 运行ning 顺利。
希望这对任何人都有帮助。
Java 7 oracle不支持TLSv1.2。 我一直在尝试 运行 我的代码,并且尝试了以下操作:
System.setProperty("deployment.security.TLSv1.1", "false")
System.setProperty("deployment.security.TLSv1", "false")
System.setProperty("deployment.security.TLSv1.2", "true")
System.setProperty("https.protocols", "TLSv1.2")
System.setProperty("https.cipherSuites", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,AES_256_GCM,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384")
但这并没有帮助。
如何强制我的 Java7 应用程序使用 Tlsv1.2。我可以 运行 我的程序使用 java8 默认情况下使用 TLS1.2 并且一切正常。
如何从 oracle 在 Java7 中完成。
我也试过进入 /usr/lib/jvm/java-7-oracle/jre/lib/security
并禁用 jdk.tls.disabledAlgorithms=SSLv2Hello, SSLv3, TLSv1
但它仍然不起作用。
我哪里错了?
顺便说一句,我明白了 sslhandshakeexception-handshake-failure
编辑:
错误:
0000: 02 28 .(
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
166 [main] DEBUG org.apache.http.impl.conn.DefaultClientConnection - Connection org.apache.http.impl.conn.DefaultClientConnection@6b18e1c6 closed
166 [main] DEBUG org.apache.http.impl.conn.DefaultClientConnection - Connection org.apache.http.impl.conn.DefaultClientConnection@6b18e1c6 shut down
main, called close()
main, called closeInternal(true)
[main] DEBUG org.apache.http.impl.conn.BasicClientConnectionManager - Releasing connection org.apache.http.impl.conn.ManagedClientConnectionImpl@1f2dc289
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1979)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1086)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:533)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:401)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:214)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:160)
我 运行 遇到了同样的问题,并且由于我使用 Apache HTTP 客户端库发出请求,所以我通过这种方式初始化我的 HttpClient 解决了它
CloseableHttpClient client = HttpClients.custom()
.setSSLSocketFactory(getSSLContext())
.build();
其中 getSSLContext()
方法是这样的
private SSLConnectionSocketFactory getSSLContext() throws NoSuchAlgorithmException {
return new SSLConnectionSocketFactory(
SSLContext.getDefault(),
new String[]{"TLSv1.2"},
null,
new NoopHostnameVerifier());
}
如果有人遇到类似问题,我会回答我自己的问题:
我花了 2 天的时间尝试了所有的东西,最后我弄明白了。
在 Java-7-oracle
中无法使用 TLS1.2。即使使用系统属性配置它或什至在 SSLContext 级别设置也没有帮助我。他们的支持非常糟糕。虽然在Java-8-oracle
,这是可能的。
只需将我的 java 更改为 java-7-openjdk-amd64
就可以了。
您可以将 Java 7 版本升级到 1.7。0_131-b31
对于 JRE 1.7。0_131-b31 在 Oracle 站点中:
TLSv1.2 and TLSv1.1 are now enabled by default on the TLS client end-points. This is similar behavior to what already happens in JDK 8 releases.
我有类似的问题,无法在 Java JDK 1.7 中启用 TLSv1.2。0_80 在 WebLogic 10.3 中,我们将其升级到 JDK 1.7。0_181,它开始为我们工作。
我遇到了类似的问题,需要好几天才能解决所有问题。我无法更新我的 JRE 版本,因为它在 HSM 上 运行ning。也许除了我还有其他人有这样的要求。
给出:
- JRE 1.7.0_25
- TOMCAT 8.0.9
要求:Tomcat 上的 Web 应用 运行ning 应该能够通过 TLSv1.2 连接到套接字。
问题 1:
JRE 1.7.0_25 无法通过 TLSv1.2 自行连接到套接字。
解法:
使用 BouncyCastle 库来实现:https://www.bouncycastle.org
问题2(解决这个问题需要好几天):
BouncyCastle 已激活并首先添加到安全提供程序,但在创建 SSLContext 和其他实例(Certificat、KeyStore、TrustManager)时仍未使用。
解法:
通过以下代码在 JSSE 中强制使用 BouncyCastle 作为安全机制:
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.insertProviderAt(new BouncyCastleJsseProvider(provider), 1);
Security.insertProviderAt(provider, 2);
而不是:
Security.insertProviderAt(new BouncyCastleProvider(), 2);
Security.insertProviderAt(new BouncyCastleJsseProvider(), 1);
但这将我引向下一个问题:
问题三:
java.lang.SecurityException: JCE 无法验证提供者 BC
解法:
BouncyCastle 的最新 jar (bcprov-jdk15on-162.jar) 以及之前的 (bcprov-jdk15on-161.jar) 没有为 1.7 正确签名。0_25,但是 bcprov-jdk15on-160.jar 是。使用版本 160 后,我终于能够使用以下代码通过 TLSv1.2 连接到套接字:
private static SSLContext createSSLContextBouncy(String base64Cert) {
BouncyCastleProvider provider = new BouncyCastleProvider();
Security.insertProviderAt(new BouncyCastleJsseProvider(provider), 1);
Security.insertProviderAt(provider, 2);
LOGGER.debug("Using bouncy castle as security provider");
try {
byte[] certBytes = Base64.decodeBase64(base64Cert);
X509Certificate cert =
(X509Certificate) CertificateFactory.getInstance("X.509", "BC").generateCertificate(new ByteArrayInputStream(certBytes));
KeyStore keystore = KeyStore.getInstance("BKS", "BC");
keystore.load(null);
keystore.setCertificateEntry("alias", cert);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX", "BCJSSE");
trustManagerFactory.init(keystore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
SSLContext sslContext = SSLContext.getInstance("TLS", "BCJSSE");
sslContext.init(null, trustManagers, new SecureRandom());
return sslContext;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
不幸的是,它仍然无法在 Tomcat 中工作。
问题四:
当我 运行 代码作为 webapp(在 Tomcat 上)时,与 TLSv1.2 的连接仍然不起作用。握手开始但结束时出现错误 "connection refused".
解法:
HSM 上的 Tomcat 版本 运行ning(也许其他人也)出于任何原因需要 30 秒的握手时间,但端点有 10 秒的超时时间。我测试了另一个版本的 Tomcat(8.0.37,因为我们有 HSM 可能支持它的信息)并且 运行ning 顺利。
希望这对任何人都有帮助。