JavaでSSL通信に挑戦してみよう。

なんだか、仕事で作ったサーバとの通信クラスが、なんだかリリース環境で例外吐きまくってるらしい。よくよく考えたら、通信プロトコルSSLに対応させる…って事がすっぱり抜けていた。
httpsなんてプロトコル知らないよException」なる例外を吐きまくっている。あたりまえ。

で、早速入れてみた。


import java.net.*;
import java.io.*;
import javax.net.ssl.HttpsURLConnection;
import java.net.HttpURLConnection;

public class JSSETest {
public static void main(String[] args) {
try {
// URLクラスのインスタンスを生成
// URL url = new URL("http:/hoge/");
URL url = new URL("https://hoge");

// 接続します
HttpsURLConnection conection = (HttpsURLConnection)url.openConnection();
// HttpURLConnection conection = (HttpURLConnection)url.openConnection();
// URLConnection conection = url.openConnection();
// 出力を行うように設定します
conection.setDoOutput( true );

// 出力ストリームを取得
PrintWriter out = new PrintWriter( conection.getOutputStream() );
out.print( "name=hoge" );
out.close();

// 入力ストリームを取得
BufferedReader in = new BufferedReader( new InputStreamReader( conection.getInputStream() ) );

// 一行ずつ読み込みます
String line;
while( (line = in.readLine() ) != null ){
// 表示します
System.out.println( line );
}

// 入力ストリームを閉じます
in.close();
} catch ( Exception e ) {
e.printStackTrace();
}
}
}

ベタなURLConnectionをHttpURLConnectionにしてみて、さらに、HttpsURLConnectionに置き換えてみた。
実際仕事で使ってるパッケージがこんなに簡素なわけはないけれども、要点はまあ、こんなもん。
会社では、全くダメだったのに、家に帰ってやってみると、拍子抜けするくらい簡単に成功。
https通信であるところの、私のbk1注文履歴ページのソースがさくさくと落ちてきた。
JDKの1.4.2であれば、このように楽勝であるけども、1.4以前だと、jsse.jar入れたりだとか、

Security.addProvider( new com.sun.net.ssl.internal.ssl.Provider() );
System.getProperties().put( "java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol" );
こういうことして、sslプロバイダを読み込んだりしなきゃならないらしい。
仕事で使ってるのは、JDK1.3.7……一応、この辺はやってみたんだがな……。何がダメなんだろう……。