おしながき
SSLSocketを使うのは、じつは簡単です。
SSLSocketを使って通信できる相手は、正しい証明書を持っている必要があります。ない場合にはエラーになってしまいます。これは外すことができないようです。
正しい証明書を使うには、認証局の証明書をJavaに登録するか、登録された認証局で証明された証明書を使う必要があります。
証明書の設定方法はセキュリティのところで書こうかな。とりあえずそこは飛ばして、プログラムのつくり方のほうへ。
SSLで通信するためには、javax.net.SSLSocketを使います。このクラスは、new SSLSocket() とするのではなく、SSLSocketFactoryから生成するようになっています。
まずは、SSLSocketFactory をつくるところから。
SocketFactory factory = javax.net.SSLSocketFactory.getDefault();
生成されたSocketFactory は、上位クラスのSocketFactory型で使えます。SocketFactory型は、Socketを生成するために使います。Socksなどに対応するためにあるのですね。
Factoryが用意できたら、いよいよSSLSocketをつくります。
SSLSocket socket = (SSLSocket)factory.createSocket(host,port);
これでSSLSocketができました。SSLSocketはSocketのサブクラスなので、Socketと全く同じように使うことができます。通信を開始する前に、SSLSocketにいろいろなオプションを設定できます。
証明書などを確認するには、SSLSessionをsocketからとりだして確認することができます。
サーバ側にはクライアント側で信頼できる証明書が必ず必要です。ない場合には相手を確認できないというような意味のjavax.net.ssl.SSLHandshakeExceptionが発生します。無視すればそのまま使えるというものでもありません。
サーバ側でも、ほとんど同じようにSSLServerSocketをつくることができます。
クライアント証明書を使うには
IPv6の使えるLinuxなどでは、IPv4しかグローバルなアドレスがないと、IPv6アドレスを持つサーバに接続できなかったりします。
ドキュメントを読めば書いてありますが、java.net.preferIPv4Stack=true というシステムプロパティを設定しておけば、IPv4を優先してくれます。