今度はブラウザ経由ではなく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(); }