簡體   English   中英

Java 7 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 Client庫發出請求,所以我解決了這種方式初始化我的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());
}

我會回答我自己的問題,因為有人有類似的問題:

我花了兩天時間嘗試了一切,最后我發現了它。

Java-7-oracle不可能使用TLS1.2。 即使使用系統屬性配置它甚至設置SSLContext級別也沒有幫助我。 他們的支持非常糟糕。 雖然在Java-8-oracle ,但它是可能的。

只需將我的java更改為java-7-openjdk-amd64就可以解決這個問題。

您可以將Java 7版本升級到1.7.0_131-b31

對於Oracle站點中的JRE 1.7.0_131-b31:

現在,TLS客戶端端默認啟用TLSv1.2和TLSv1.1。 這與JDK 8版本中已經發生的行為類似。

我有類似的問題,無法在WebLogic 10.3中的Java JDK 1.7.0_80中啟用TLSv1.2,我們將其升級到JDK 1.7.0_181,它開始為我們工作。

我有類似的問題,需要多天才能解決我的所有問題。 我無法更新我的JRE版本,因為它在HSM上運行。 也許除了我之外還有其他人有這樣的要求。

已知:

  • JRE 1.7.0_25
  • TOMCAT 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)時仍未使用。

解:

通過以下代碼強制使用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:

java.lang.SecurityException:JCE無法驗證提供程序BC

解:

最新版本的BouncyCastle(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可能支持它的信息)並且它運行順利。

希望這有助於任何人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM