【问题标题】:How to disable all network connections in Java on Windows Server 2008如何在 Windows Server 2008 上禁用 Java 中的所有网络连接
【发布时间】:2011-06-06 10:41:47
【问题描述】:

有没有办法在 Windows Server 2008 上运行 Java VM (java.exe) 并使用命令行参数或系统变量禁用所有网络连接?

【问题讨论】:

  • 解决方案应该能够禁用每个 Java VM 进程的网络,并且应该从进程外部定义(不让进程禁用自己的网络)。
  • 这个问题可以问得更好,不是吗。
  • 你一开始就应该这么说。您成为 SO 用户的时间已经足够长,知道在提问时提供相关详细信息的重要性。

标签: java windows network-programming windows-server-2008


【解决方案1】:

您可以通过启用默认 Java 安全管理器来做到这一点。默认情况下不强制执行任何安全措施,因此您可以做任何事情,但如果启用了安全管理器,它将限制网络访问、文件访问和许多其他事情,除非您在安全策略文件中另外指定。

要启用默认安全管理器,请在启动时将此参数传递给 JVM。

java -Djava.security.manager=default my.main.Class

通过这样做,来自 JVM 内部的任何网络访问尝试都会抛出 java.net.NetPermission

这也会破坏文件访问等内容,因此如果您需要允许它,您需要在特殊的安全策略文件 (-Djava.security.policy=path/to/policy.file) 中指定这些内容。应该有很多如何设置的示例,只需搜索“java权限”即可开始。

【讨论】:

    【解决方案2】:

    我有同样的任务来测试我们产品的离线安装程序。上面说的几乎都是对的,但是第一次创建 .policy 文件并不容易。这是我所做的:

    1. 创建的通用策略文件无权解析主机名(参见下面的代码 sn-p);

    2. 在 jvm 参数中添加了-Djava.security.manager -Djava.security.policy=pathto/policy.file

    通用 .policy 文件内容:

    grant {
        permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute,delete";
        permission java.util.PropertyPermission "*", "read,write";
        permission java.lang.RuntimePermission "*";
        permission java.net.NetPermission "*";
        permission java.lang.reflect.ReflectPermission "*";
    };
    

    如果在测试期间有东西试图从外面获取内容,它会失败并出现安全异常。

    【讨论】:

      【解决方案3】:

      好吧,我没有尝试过,但理论上您可以将 SOCKS 代理的系统属性设置为不存在的属性,并且根据文档,所有 TCP 套接字都将通过 SOCKS 代理进行尝试 - 并且失败。

      类似这样的:

      java -DsocksProxyHost=127.0.0.1 SomeClass
      

      【讨论】:

      • 我可以设置一个虚拟代理并让它失败,但我希望能够告诉 Java“你可能不使用网络”。
      • 是的,这行得通。这有点脏,但为了快速测试,设置安全管理器比配置安全管理器更容易,默认情况下,除了网络访问之外,它会限制许多其他事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 2012-08-05
      • 2010-09-26
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      相关资源
      最近更新 更多