Tomcat6でSSL Java6でSSL通信

今度はブラウザ経由ではなくJava6からSSL通信をしてみる。
Javaではブラウザ経由のように警告がでると厄介なので、localhostサーバーを信頼することにしよう。
そのために前々回で作成したキーストアでmyserverentryの証明書を発行する。
keytool -export -alias myserverentry
-keystore “/hoge/server.jks”
-file “/hoge/server.cer”

これでlocalhostサーバーの証明書(/hoge/server.cer)ができた。
本来なら由緒正しい認証局のお墨付きが必要なのだが、localhostサーバーが安全なのは自明なのだからこれで十分。

次にJavaへlocalhostサーバーの証明書を渡す必要がある。
通常Javaは%JAVA_HOME%/lib/security/cacertsというキーストア(クライアント側だからトラストストアと言う)を使っている。
ここにlocalhostサーバーの証明書を入れればいいのだが、他のJavaアプリに迷惑がかかるので、専用のキーストア(/hoge/client.jks)を作ることにする。
keytool -genkey -alias mycliententry -keyalg RSA
-keystore “/hoge/client.jks”

このキーストアに上記で作成した証明書(/hoge/server.cer)をインポートする。
keytool -import -alias mycliententry
-keystore “/hoge/client.jks”
-file “/hoge/server.cer”

以上でJavaに渡すトラストストア(/hoge/client.jks)は完成した。
JavaにはVM引数で渡すことにする。
書式は以下。
-Djavax.net.ssl.trustStore=/hoge/client.jks
-Djavax.net.ssl.trustStorePassword=トラストストアのパスワード

サンプルコードは以下の通り。
HttpURLConnectionはSSL通信の際はHttpsURLConnectionとなり、通常通信と同様のステートメントで大丈夫だ。

try {
  URL url = new URL("https://localhost:8443");
  HttpURLConnection con = 
         (HttpURLConnection)url.openConnection();
  if(con != null) {
    con.connect();
    InputStreamReader in = 
    new BufferedReader(
        new InputStreamReader(con.getInputStream()));
    String str;
    while((str = in.readLine()) != null) {
      System.out.println(str);
    }
    in.close();
    con.disconnect();
  }
} catch(Exception e) {
  e.printStackTrace();
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です