【Java】SSL通信を実装する

環境
作業対象ファイル: C:\ssl
JDKのパス: C:\Program Files\Java\jdk1.6.0_45\bin
対象のサーバー証明書名: sample.cer

keyStore と trustStoreとは?
keystore: サーバーに送信するクライアントの証明書を格納するファイル。
trustStore: クライアント側が認証するサーバー側の証明書を格納するファイル。

手順
KeyStoreとTrustStore保存用ディレクトリを作成(C:\ssl)

認証対象のサーバー証明書(sample.cer)を C:\ssl に配置

ターミナルをAdministrator権限で実行し、インストール済みのJDK(C:\Program Files\Java\jdk1.6.0_45\bin)に移動。

以下のコマンドでkeyStoreを新規作成 -storepass の引数がパスワードとなります。

$ keytool -genkey -keystore keystore -storepass hogehoge

※この際、色々と設定を聞かれますが、よしなに...


同じくtrustStoreを新規作成

$ keytool -genkey -keystore truststore -storepass hogehoge


続いて sample.cer を trustStore に以下のコマンドでインポート -alias の引数が管理名として登録されます。

$ keytool -import -trustcacerts -file C:/ssl/sample.cer -keystore "C:/ssl/truststore" -alias sample_ssl


インポートされているかを以下のコマンドで確認

$ keytool -v -list -keystore  "C:/ssl/truststore"


インポートされている証明書の一覧が出てくるので、今回追加した sample_ssl が存在していれば成功。

以下サンプルコード

    /**
     * 認証付SSLContext作成
     * @param key_path Keystoreファイルのpath
     * @param key_password Keystoreファイルのpassword
     * @param trust_path Truststoreファイルのpath
     * @param trust_password Truststoreファイルのpassword
     * @return
     * @throws Exception
     */
    private SSLContext ssl_auth(String key_path, String key_password, String trust_path, String trust_password) throws Exception{
        //KeyStore読み込み
        char[] key_pass_char = key_password.toCharArray();
        KeyStore key_store = KeyStore.getInstance("JKS");
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

        key_store.load(new FileInputStream(key_path), key_pass_char );
        kmf.init(key_store, key_pass_char);

        //TrustStoreの読み込み
        char[] trust_pass_char =TrustPass.toCharArray();;
        KeyStore trust_store = KeyStore.getInstance("JKS");
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");

        trust_store.load(new FileInputStream(TrustPath), trust_pass_char);
        tmf.init(trust_store);

        KeyManager[] key_managers = kmf.getKeyManagers();
        TrustManager[] trust_managers = tmf.getTrustManagers();

        SSLContext sslcontext = SSLContext.getInstance("TLS");
        sslcontext.init(key_managers, trust_managers, null);

        return sslcontext;
    }


     URL urlObj = new URL(url);
     HttpsURLConnection http = (HttpsURLConnection) urlObj.openConnection();
     http.setRequestMethod("POST");
     http.setDoOutput(true);
     http.setConnectTimeout(30000); 
     http.setReadTimeout(30000); 
     http.setSSLSocketFactory(ssl_auth("C:/ssl/keystore", "hogehoge", "C:/ssl/trustStore", "hogehoge").getSocketFactory());
     http.connect();

     OutputStream os = http.getOutputStream();
     PrintStream ps = new PrintStream(os);
     ps.print("送信するパラメータ");
     ps.close();