web-dev-qa-db-ja.com

TLSv1.2およびTLS_RSA_WITH_AES_256_CBC_SHA256暗号スイートを有効にします

Server: 
TLS Version: v1.2
Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA256 

Client:
JRE 1.7

SSLを介してクライアントからサーバーに直接接続しようとすると、次のエラーが表示されます。

Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
        at Sun.security.ssl.Alerts.getSSLException(Alerts.Java:192)
        at Sun.security.ssl.Alerts.getSSLException(Alerts.Java:154)

以下のコードはTLSv1.2を有効にします

  Set<String> enabledTLSSet = new HashSet<String>(Arrays.asList(sslsocket.getEnabledProtocols()));
  enabledTLSSet.add("TLSv1.2");      
  sslsocket.setEnabledProtocols(enabledTLSSet.toArray(new String[enabledTLSSet.size()]));

以下のコードは、TLS_RSA_WITH_AES_256_CBC_SHA256 Cipher Suiteを有効にします。

Set<String> enabledCipherSuitesSet = new HashSet<String>(Arrays.asList(sslsocket.getEnabledCipherSuites()));
      enabledCipherSuitesSet.add("TLS_RSA_WITH_AES_256_CBC_SHA256");
      sslsocket.setEnabledCipherSuites(enabledCipherSuitesSet.toArray(new String[enabledCipherSuitesSet.size()]));

上記の両方をJavaコードから実行した後、SSLを介してサーバーに正常に接続できます。

有効化/強制することは可能ですかTLSv1.2およびTLS_RSA_WITH_AES_256_CBC_SHA256 in Java 7を変更せずにJavaプロパティ、パラメーター、またはデバッグプロップを使用してコード?

すべてのフォームと組み合わせ(有効化と無効化)で以下のプロパティをすべて試しましたが、失敗しました。

-Dhttps.protocols=TLSv1.2
-Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256
-Ddeployment.security.TLSv1.2=true

以下のようなプログラムを実行しています。

Java -jar -Dhttps.protocols=TLSv1.2 -Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256 Ddeployment.security.TLSv1.2=true -Djavax.net.debug=ssl:handshake SSLPoker.jar <SERVER> 443

SSLPokerには以下のコードが含まれています。

package com.ashok.ssl;

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import Java.io.*;

/**
 * Establish a SSL connection to a Host and port, writes a byte and prints the response - Ashok Goli. See
 * http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services
 */
public class SSLPoke {

  /**
   * The main method.
   * Usage: $Java -jar SSLPoker.jar <Host> <port>
   *
   * @param args the arguments
   */
  public static void main(String[] args) {
    if (args.length != 2) {
      System.out.println("Usage: " + SSLPoke.class.getName() + " <Host> <port>");
      System.exit(1);
    }
    try {
      SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
      SSLSocket sslsocket =
          (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1]));

      InputStream in = sslsocket.getInputStream();
      OutputStream out = sslsocket.getOutputStream();

      // Write a test byte to get a reaction :)
      out.write(1);

      while (in.available() > 0) {
        System.out.print(in.read());
      }
      System.out.println("Successfully connected");

    } catch (Exception exception) {
      exception.printStackTrace();
    }
  }
}

Javaコード変更なしでこれを達成する方法についてのポインタは大歓迎です。

18
Ashok Felix

プロパティを使用して単純なHTTPS接続(SSLソケットではない)を使用する場合にのみ可能です

-Dhttps.protocols=TLSv1.2 
-Dhttps.cipherSuites=TLS_RSA_WITH_AES_256_CBC_SHA256

http://fsanglier.blogspot.com.es/ の投稿を参照してください

Java 7はTLS v1.2のサポートを導入しました( http://docs.Oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html を参照)しかし、デフォルトで有効にします。つまり、クライアントアプリはSSLContextの作成時に「TLS v1.2」を明示的に指定する必要があります。そうしないと、クライアントアプリで使用できなくなります。

直接セキュアソケットプロトコルを使用する必要がある場合は、アプリケーションの起動時に「TLSv1.2」SSLContextを作成し、SSLContext.setDefault(ctx)呼び出しを使用して、その新しいコンテキストをデフォルトとして登録します。

SSLContext context = SSLContext.getInstance("TLSv1.2");
SSLContext.setDefault(context);
17
pedrofb

JREは、デフォルトですべての256ビット暗号を無効にします。有効にするには、Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Filesをここからダウンロードできます: http://www.Oracle.com/ technetwork/Java/javase/downloads/index.html

local_policy.jarおよびUS_export_policy.jarjarファイルをlibに置き換えますjreディレクトリの/ security。

8

現在のJREは、lib/security、それぞれ個別のサブフォルダにあります。デフォルトでは、lib/security/Java.securitylimitedポリシーがデフォルトで使用されます。ただし、crypto.policy=unlimited行。Javaがunlimitedポリシーファイルを使用し、256ビットの暗号化/アルゴリズムを有効にすることを許可します。

2
Kumba