3

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。我可以使用默认使用 TLS1.2 的 java8 运行我的程序,并且一切正常。

我怎样才能在 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)
4

5 回答 5

2

我遇到了同样的问题,因为我是使用 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());
}
于 2017-03-08T14:27:45.530 回答
1

如果有人遇到类似问题,我将回答我自己的问题:

我花了 2 天时间尝试一切,最后我弄明白了。

因为Java-7-oracle它不可能使用 TLS1.2。即使使用系统属性配置它,甚至在 SSLContext 级别设置也对我没有帮助。他们的支持非常糟糕。虽然在Java-8-oracle,这是可能的。

只需更改我的 java 即可java-7-openjdk-amd64为我解决问题。

于 2017-03-13T09:54:23.357 回答
0

我有类似的问题,需要几天时间来解决我所有的问题。我无法更新我的 JRE 版本,因为它在 HSM 上运行。也许除了我之外还有其他人有这样的要求。

给定:

  • JRE 1.7.0_25
  • 汤姆猫 8.0.9

要求:在 Tomcat 上运行的 webapp 应该能够通过 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);

但这导致我遇到下一个问题:

问题3:

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 中工作。

问题4:

当我将代码作为 webapp(在 Tomcat 上)运行时,与 TLSv1.2 的连接仍然无效。握手正在开始,但以错误“连接被拒绝”结束。

解决方案:

在 HSM 上运行的 Tomcat 版本(可能还有其他版本)出于任何原因需要 30 秒的握手时间,但端点有 10 秒的超时。我用另一个版本的 Tomcat(8.0.37,因为我们知道 HSM 可能支持它)进行了测试,它运行顺利。

希望这对任何人都有帮助。

于 2019-06-11T09:32:59.470 回答
0

您可以将 Java 7 版本升级到 1.7.0_131-b31

对于 Oracle 站点中的 JRE 1.7.0_131-b31:

TLSv1.2 和 TLSv1.1 现在默认在 TLS 客户端端点上启用。这与 JDK 8 版本中已经发生的行为类似。

于 2017-10-06T06:21:48.020 回答
0

我有类似的问题,无法在 WebLogic 10.3 中的 Java JDK 1.7.0_80 中启用 TLSv1.2,我们将其升级到 JDK 1.7.0_181,它开始为我们工作。

于 2018-06-12T19:11:05.527 回答