1. 概要
SSL接続に関しては、TLSv1.2を使用する必要があります。実際、これはJava8のデフォルトのSSLプロトコルです。
また、Java 7はTLSv1.2をサポートしていますが、デフォルトはTLS v1.0であり、最近では弱すぎます。
このチュートリアルでは、TLSv1.2を使用するようにJava7を構成するためのさまざまなオプションについて説明します。
2. JavaVM引数の使用
Java 1.7.0_95以降を使用している場合は、jdk.tls.client.protocolsプロパティをjavaコマンドライン引数として追加して、TLSv1.2をサポートできます。
java -Djdk.tls.client.protocols=TLSv1.2 <Main class or the Jar file to run>
ただし、Java 1.7.0_95は、Oracleからサポートを購入したお客様のみが利用できます。 したがって、Java 7でTLSv1.2を有効にするために、以下の他のオプションを確認します。
3. SSLSocketの使用
この最初の例では、SSLSocketFactoryを使用してTLSv1.2を有効にします。
初め、 SSLSocketFactory#getDefaultファクトリメソッドを呼び出すことにより、デフォルトのSSLSocketFactoryオブジェクトを作成できます。
次に、ホストとポートをSSLSocket#createSocketに渡すだけです。
SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket(hosturl, port);
上記で作成されたデフォルトのSSLSocketには、SSLプロトコルが関連付けられていません。 SSLプロトコルをSSLSocketに関連付けるにはいくつかの方法があります。
最初のアプローチでは、サポートされているSSLプロトコルの配列をSSLSocketインスタンスのsetEnabledProtocolsメソッドに渡すことができます。
sslSocket.setEnabledProtocols(new String[] {"TLSv1.2"});
または、同じ配列を使用してSSLParametersを使用することもできます。
SSLParameters params = new SSLParameters();
params.setProtocols(new String[] {"TLSv1.2"});
sslSocket.setSSLParameters(params);
4. SSLContextの使用
SSLSocket を設定すると、1つの接続のみが直接変更されます。 SSLContext を使用して、SSLSocketFactoryの作成方法を変更できます。
だから、使用する代わりに SSLSocketFactory#getInstance 、 パラメータとして「TLSv1.2」を指定して、SSLContext#getInstanceを実行してみましょう。 ここからSSLSocketFactoryを取得できます。
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, new SecureRandom());
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket) socketFactory.createSocket(url, port);
簡単な補足として、SSLを使用する場合は、常にSecureRandomを使用することを忘れないでください。
5. HttpsURLConnectionを使用する
もちろん、必ずしも直接ソケットを作成しているわけではありません。 多くの場合、私たちはアプリケーションプロトコルレベルにいます。
最後に、HttpsURLConnectionでTLSv1.2を有効にする方法を見てみましょう。
まず、URLのインスタンスが必要です。 https://example.orgに接続していると想像してみましょう。
URL url = new URL("https://" + hosturl + ":" + port);
これで、以前のようにSSLContextを設定できます。
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, new SecureRandom());
次に、最後の手順は、接続を作成し、SSLSocketFactoryを提供することです。
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());
6. 結論
この簡単な記事では、Java7でTLSv1.2を有効にするいくつかの方法を示しました。
この記事で使用されているコードサンプルは、GitHubでから入手できます。