症状
OS X(Mac)環境でJavaをアップデートしたら、あるサイトで以前は正常に実行できていたはずのJavaアプレットが次のようなエラーで実行できなくなりました。
Error: access denied ("Java.net.SocketPermission" "<Hostname>:<Port>" "connect,resolve")
※注:実際のエラーメッセージでは<Host>および<Port>には実際のホスト名とポート番号が入っていました。
別のブラウザを試してみても同じエラーが発生していました。
原因
Java7u51でセキュリティのデフォルト設定が変更されたようです。以前は、ポート番号1024以上のソケット接続は全て許可されていたのが、エフェメラルポートのみを許可するようになりました。エフェメラルポートの範囲はOSごとに異なり、例えばWindows Vista以降では49152から65535、Linuxでは32768から61000などです。この範囲ではないポートに接続する場合、セキュリティポリシーの設定が必要になります。
※参考1 → http://qiita.com/pekokun@github/items/7307fd8c138fe3d2ceb4
※参考2 → http://d.hatena.ne.jp/seraphy/20140214
対処
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/java.policy を編集し、下記の記述を追加します。
grant codeBase "https://<Host>/*" {
permission java.net.SocketPermission "<Host>:<Port>", "connect";
};
上記記述で、<Host>にはホスト名またはIPアドレス、<Port>にはポート番号あるいはポート番号の範囲(下限-上限)を指定します。(もちろん"https"はサイトに応じて"http"になると思います。)
ちなみに、エラーメッセージではアクションが"connect,resolve"になっていますが、設定側では"resolve"以外のいずれかのアクションを指定すると暗黙的に"resolve"も指定したことになるので、"connect"だけで大丈夫です。
※参考 → https://docs.oracle.com/javase/jp/6/api/java/net/SocketPermission.html
変更を保存したら、ブラウザを再起動します。これでJavaアプレットが実行できるようになります。