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