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から入手できます。