しいしせねっとわーく
[Java] [RMI] [セキュリティ]

Javaネットワーク編

おしながき

SSLだよSocketは

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とJava

IPv6の使えるLinuxなどでは、IPv4しかグローバルなアドレスがないと、IPv6アドレスを持つサーバに接続できなかったりします。

ドキュメントを読めば書いてありますが、java.net.preferIPv4Stack=true というシステムプロパティを設定しておけば、IPv4を優先してくれます。