3

Java 7 oracle does not support TLSv1.2. I have been trying to run my code and I have tried the following things:

    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")

and it does not help.

How can I force my Java7 application to use Tlsv1.2. I can run my program using java8 which by default uses TLS1.2 and everything works perfectly.

How can I do it in Java7 from oracle.

I have also tried going into /usr/lib/jvm/java-7-oracle/jre/lib/security and disabled jdk.tls.disabledAlgorithms=SSLv2Hello, SSLv3, TLSv1 but it still does not work.

What am I dong wrong?

Btw I get sslhandshakeexception-handshake-failure

EDIT:

Error:

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

0

同様の問題があり、すべての問題を解決するのに数日かかりました。HSM で実行されているため、JRE バージョンを更新できません。たぶん、私以外にもそのような要件を持っている人がいます。

与えられた:

  • 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) と以前の 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:

(Tomcat で) webapp としてコードを実行すると、TLSv1.2 への接続が機能しません。ハンドシェイクは開始されましたが、「接続が拒否されました」というエラーで終了します。

解決:

HSM で実行されている Tomcat バージョン (おそらく他のバージョンも) は、何らかの理由でハンドシェイクに 30 秒必要ですが、エンドポイントには 10 秒のタイムアウトがあります。別のバージョンの Tomcat (HSM がサポートしている可能性があるという情報があるため、8.0.37) でテストしたところ、スムーズに動作していました。

これが誰にも役立つことを願っています。

于 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 に答える