0

我一直在开发一个 Web 应用程序,该应用程序部署在 Apache Tomcat 6 中,运行 Java 6 Update 31。需要包含一个模块,该模块将简单地监听端口 X 上的传入 TCP 流量以供将来处理。在我们启用 Java 安全管理器(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

The socket permission *:54321/accept allows you to accept connections from any host using the remote port 54321. That does not make much sense, but a permission like e.g. 192.168.1.50:*/accept would allow you to accept connections from 192.168.1.50 using any port.

If you want to listen for incoming connections on port 54321, you need a permission *:54321/listen (not accept). You can combine these permissions to describe on which local ports your Java process is allowed to listen and from which remote hosts it is allowed to accept connections.

于 2012-04-24T17:10:30.560 回答