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コード変更なしでこれを達成する方法についてのポインタは大歓迎です。
プロパティを使用して単純な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);
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。
現在のJREは、lib/security
、それぞれ個別のサブフォルダにあります。デフォルトでは、lib/security/Java.security
、limited
ポリシーがデフォルトで使用されます。ただし、crypto.policy=unlimited
行。Javaがunlimited
ポリシーファイルを使用し、256ビットの暗号化/アルゴリズムを有効にすることを許可します。