有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java 7 oracle不支持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.我可以使用默认使用TLS1的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)

共 (3) 个答案

  1. # 1 楼答案

    我遇到了同样的问题,因为我是使用ApacheHTTP客户端库发出请求的,所以我用这种方式初始化我的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. # 2 楼答案

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

    鉴于:

    • JRE 1.7.0_25
    • TOMCAT 8.0.9

    要求:在Tomcat上运行的webapp应该能够通过TLSv1连接到套接字。二,

    问题1:

    JRE 1.7.0_25无法通过TLSv1连接到套接字。2

    解决方案:

    使用BouncyCastle库执行此操作:https://www.bouncycastle.org

    问题2(解决此问题需要几天):

    BouncyCastle首先被激活并添加到安全提供程序中,但在创建SSLContext和其他实例(Certificate、KeyStore、TrustManager)时仍然没有使用

    解决方案:

    通过以下代码强制将BouncyCastle用作JSSE中的安全配置:

    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:

    爪哇。lang.SecurityException:JCE无法验证提供程序BC

    解决方案:

    BouncyCastle的最新jar(bcprov-jdk15on-162.jar)和之前的jar(bcprov-jdk15on-161.jar)没有为1.7.0_25正确签名,而是bcprov-jdk15on-160。罐子是。在使用了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:

    连接到TLSv1。当我以webapp(在Tomcat上)运行代码时,2仍然不起作用。握手开始时出现了一个错误,提示“连接被拒绝”

    解决方案:

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

    希望这对任何人都有帮助

  3. # 3 楼答案

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

    我花了两天的时间尝试了所有的事情,最终我找到了答案

    Java-7-oracle中,不可能使用TLS1。2.即使使用系统属性进行配置,甚至在SSLContext级别进行设置,也无助于我。他们的支持很差。尽管在Java-8-oracle中,这是可能的

    简单地将我的java更改为java-7-openjdk-amd64就帮了我的忙