java rmi authentication&安全。 exportObject使它公开?

时间:2009-10-09 02:59:18

标签: java rmi

问题:

当你UnicastRemoteObject.exportObject(instance)时。该实例现在是否可供所有客户公开使用。即使找到它的端口有点棘手。

情况如此:

我有一个java RMI客户端/服务器设置,我想添加一些身份验证。允许客户端在任何其他RPC调用工作之前使用用户/传递组合。

我在网上发现了一个简单的建议,起初看起来不错。

interface LoginService implements Remote {
  public MainService login(String username, char[] password) throws RemoteException;
}

interface MainService implements Remote {
  /* all my real rpc calls go here */
}

这个想法是,创建一个远程对象来体现对RPC的经过身份验证的访问。并通过执行身份验证的第一层访问它。

LoginServiceImpl.login()必须看起来像那样。

public MainService login(String username, char[] password) throws RemoteException {
  /* verify username and password */
  MainService service = new MainServiceImpl();
  MainService stub = UnicastRemoteObject.exportObject(service, 0);
  return stub;
}

因此,调用login()的每个客户端都会获得自己的MainService专用远程实例。当然,我将整个东西包装在ssl中以保护纯文本密码。

这就是问题:

似乎在我导出新的MainServiceImpl实例后,它现在已公开发布。知道要查找的内容的任何其他客户端都可以连接到它并在MainServiceImpl实例上进行调用。

我必须在创建后导出MainService,否则RMI不会将存根发送到客户端。相反,它会尝试序列化MainService实例。

我可以将用户名粘贴在MainService中,但实际上并没有帮助。

2 个答案:

答案 0 :(得分:0)

在切换到JRMP(RMI线路协议)之前,您需要进行身份验证。有一个JSR,但它被拒绝了。 JERI是为JINI做的。

答案 1 :(得分:0)

使用客户端身份验证的SSL可以解决此问题。