HttpClientでの認証 3(HttpClient4.0)

前回までのを更に改造して、HTTPSに対応させてみます。

追加の設定値は以下の通り。

設定値
KEYSTOREキーストア
STOREPWDストアパスワード

キーストアについては詳しく書きませんが、Javaではキーストアで暗号化の鍵と証明書を管理しています。
ここではキーストアの場所を指定します。

(例)キーストアの場所
UNIX$JAVA_HOME/jre/lib/security/cacerts
Windows%JAVA_HOME%\jre\lib\security\cacerts

ストアパスワードはストアを読み取る時に必要なパスワードです。
デフォルトでは changeit になっています。


変更がある設定値は以下の通り。
前回までは80番ポートを想定していましたが、今回はHTTPSなので443番ポートになります。

設定値
TARGETPORTポート番号


新たに27~37行目を追加し、HTTPSに対応させます。

キーストアから証明書を取得します。

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream instream = new FileInputStream(new File(KEYSTORE));
trustStore.load(instream, STOREPWD.toCharArray());
instream.close();

取得した証明書をHttpClientへ登録し、HTTPS通信を可能にします。

SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
Scheme sch = new Scheme("https", socketFactory, TARGETPORT);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);

sampleコード
package sample.http;


import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;

import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;


public class HttpAuthPost {
    
    public final int execute() throws Exception {
        
        DefaultHttpClient httpclient = new DefaultHttpClient();
        
        KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
        FileInputStream instream = new FileInputStream(new File(KEYSTORE));
        
        trustStore.load(instream, STOREPWD.toCharArray());
        instream.close();
        
        SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
        Scheme sch = new Scheme("https", socketFactory, TARGETPORT);
        
        // SSL設定
        httpclient.getConnectionManager().getSchemeRegistry().register(sch);
        
        // BASIC認証用設定
        httpclient.getCredentialsProvider().setCredentials(
            new AuthScope(TARGETHOST, TARGETPORT),
            new UsernamePasswordCredentials(UID, PWD));
        
        // 接続先ホスト設定
        HttpHost host = new HttpHost(TARGETHOST, TARGETPORT, "https");
        // プロキシホストを設定
        HttpHost proxy = new HttpHost(PROXYHOST, PROXYPORT);
        httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
        // ターゲットURLを設定
        HttpPost httppost = new HttpPost(TARGETURL);
        // 送信ファイル生成
        FileBody file = new FileBody(new File(FILE));
        
        MultipartEntity reqEntity = new MultipartEntity();
        reqEntity.addPart("file", file);
        
        httppost.setEntity(reqEntity);
        
        HttpResponse response;
        
        response = httpclient.execute(host, httppost);
            
        httpclient.getConnectionManager().shutdown();
        
        return response.getStatusLine().getStatusCode();
    }
    
}

※前回まではプロトコルを http にしていましたが、今回は https になっています。

コメント