はらこメモ

プログラミングに関して調べたことについてのメモ書きです。言語はバラバラ…。

Java7 TLSv1.2 Apache Commons HttpClient3.1

・Java7
・TLSv1.2
Apache Commons HttpClient3.1

※TLSv1.2はJava7以上が必須

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.net.ssl.SSLContext;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;

public class HttpClientTLSv12 {

    static {
        //System.setProperty("javax.net.debug", "ssl");
        //System.setProperty("https.protocols", "TLSv1.2");
        //System.setProperty("jdk.tls.client.protocols", "TLSv1.2");
        //System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog");
        //System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
        //System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire.header", "debug");
        //System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient", "debug");
    }

    public static void main(String[] args) {
        HttpClientTLSv12 tls = new HttpClientTLSv12();
        tls.execute();
    }

    public HttpClientTLSv12() {
    }

    private void execute() {
        GetMethod httpget = null;
        BufferedReader br = null;
        try {
            // 使用するSSLプロトコルのデフォルトをTLS1.2にする
            SSLContext ctx = SSLContext.getInstance("TLSv1.2");
            ctx.init(null, null, null);
            SSLContext.setDefault(ctx);

            // Apache Commons HttpClient3.1
            HttpClient httpclient = new HttpClient();
            httpget = new GetMethod("https://www.yahoo.co.jp/");
            httpclient.executeMethod(httpget);

            // Response
            System.out.println(httpget.getStatusLine());
            InputStream is = httpget.getResponseBodyAsStream();
            br = new BufferedReader(new InputStreamReader(is));
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            if(httpget != null) {
                httpget.releaseConnection();
                httpget= null;
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    //
                }
                br = null;
            }
        }
    }
}

2019/10/15 追記
・Java8の場合は、TLSv1.2がデフォルトのため、下記の記述は不要

// 使用するSSLプロトコルのデフォルトをTLS1.2にする
SSLContext ctx = SSLContext.getInstance("TLSv1.2");
ctx.init(null, null, null);
SSLContext.setDefault(ctx);

・下記ファイルにルート証明書が設定されている必要がある

%JAVA_HOME%/lib/security/cacerts

・Java7でVM引数やプロパティにTLSv1.2を設定すれば動くみたいな記事を見かけるけど上手く動作しない。

-Dhttps.protocols=TLSv1.2
-Djdk.tls.client.protocols=TLSv1.2

System.setProperty("https.protocols", "TLSv1.2");
System.setProperty("jdk.tls.client.protocols", "TLSv1.2");

・参考
java tls1 Commons HTTPClient 3.1にTLS 1.2をHTTPS専用に使用させる方法 - 初心者入門サンプル