0

Java 6 Update 31 を実行する Apache Tomcat 6 にデプロイされる Web アプリケーションを開発しています。今後の処理のために、ポート X で着信 TCP トラフィックを単にリッスンするモジュールを含める必要があります。Java Security Manager (IA 要件) を有効にするまで、すべてがうまく機能していました。

有効にすると、AccessControlExceptions が発生し始めましたが、ポリシー ファイルにこのトラフィックを明示的に許可しているものがないため、これは予期されたものでした。そこで、Tomcat の「catalina.policy」ファイルに次の行を追加しました (ここで、54321 はアプリがリッスンしているポートです)。

grant {
  permission java.net.SocketPermission "*:54321", "accept, resolve";
};

ただし、次のような AccessControlExceptions がまだ表示されていました。

java.security.AccessControlException: access denied (java.net.SocketPermission 192.168.1.50:1527 accept,resolve)

そのエラー行を見て、「192.168.1.50」が実際にはクライアントの IP であることに気付きました。したがって、「1527」はソケットのクライアント側ポートでなければなりません。これは、これが試行されるたびにこのポートが変更されるという事実によって確認されます...

私の質問は、なぜ私の Web アプリケーションがクライアント ポートを気にする必要があるのか​​ということです。私の理解では、発信接続は単に任意/ランダムなポートを使用するだけです。私の側では、このポリシー ファイルに関して、リッスンするポートを指定するだけでよいように思えます。ただし、これを機能させる唯一の方法は、上記の許可行で「54321」を「*」に変更して、JVM を世界中に開放することです。

ここで構文について何か誤解していますか? アプリケーションがサーバー ポート 54321 で、任意のホスト、任意のクライアント側ポートからの接続を受け入れるようにするにはどうすればよいですか?

ありがとう、ダグ

4

1 に答える 1

0

ソケットパーミッション *:54321/accept により、リモートポート 54321 を使用する任意のホストからの接続を受け入れることができます。これはあまり意味がありませんが、たとえば 192.168.1.50:*/accept のようなパーミッションにより、192.168 からの接続を受け入れることができます。任意のポートを使用して 1.50。

ポート 54321 で着信接続をリッスンする場合は、許可 *:54321/listen (受け入れない) が必要です。これらの権限を組み合わせて、Java プロセスがリッスンできるローカル ポートと、接続を受け入れることができるリモート ホストを指定できます。

于 2012-04-24T17:10:30.560 に答える