如何限制Java RMI到特定的接口?

问题描述:

我们的产品有两个接口,一个是面向客户的内部接口。是否有可能让rmi仅在特定接口(如环回)上运行,或者我们是否需要使用防火墙规则来防止访问?如何限制Java RMI到特定的接口?

有没有办法让服务器只绑定到指定接口的请求?我发现这个属性可以在服务器上设置,这是否会阻止外部请求?

-Djava.rmi.server.hostname=127.0.0.1

有没有办法有rmiregistry中选择它侦听像MySQL的绑定选项的界面?

这个问题似乎有关,但我希望有一个简单的答案: Java RMI: How can I restrict RMI method to only be called internally by the client object

+0

是的,它可能的,使用插座工厂。 https://docs.oracle.com/javase/7/docs/api/java/rmi/server/UnicastRemoteObject.html#UnicastRemoteObject(int,%20java.rmi.server.RMIClientSocketFactory,%20java.rmi.server.RMIServerSocketFactory) – Antoniossss

我发现这个特性,可以在服务器上进行设置,这也防止外部请求?

-Djava.rmi.server.hostname=127.0.0.1 

该属性控制哪些IP地址放在删除此JVM导出对象的存根。如果你想限制这些客户端的'本地主机'设置这实际上会工作,但它不是一个很好的解决方案。

您将不得不导出带有RMIServerSocketFactory的远程对象,该RMIServerSocketFactory会创建绑定到您想要的特定IP地址的ServerSockets

有没有办法让rmiregistry选择它所监听的接口,就像mysql的绑定选项一样?

相同的答案。您将不得不通过LocateRegistry.createRegistry(int port, RMIServerSocketFactory ssf, RMIClientSocketFactory csf)自己导出注册表。 csf当然可以为空。

如果您在导出JVM中使用了多个实例,请确保您的RMIServerSocketFactory已合理实现equals(),例如,只要绑定IP地址相同,它们就是相等的。

这个问题似乎与

它不是。

+0

有没有更好的方法来保护您建议的RMI端口?主要目标是防止来自我们客户网络的攻击。 – simgineer