编写一个安全的RMI服务器-客户端应用程序

3
我正在编写一个服务器-客户端应用程序,通信是通过互联网进行的,我有几个关于安全性的问题和顾虑。我已经做了一些研究,并发现这里的一些帖子很有用,但我想要更多信息。我读到了一些相关的问题:

如何安全地验证RMI客户端

Java RMI身份验证和安全性。exportObject会使其公开吗?

Java RMI的通信是否安全?

我有三个部分需要考虑:

  1. 客户端和服务器之间交换的信息。
  2. 客户端的身份验证。
  3. 利用正在运行的RMI服务器(黑客等)。

我所知道的是:

  1. RMI通过SSL。使用SSL套接字而不是默认套接字将加密客户端和服务器之间传递的所有信息。这包括对象交换和方法调用。
  2. 在建立RMI连接之前,使用用户名/密码组合通过SSL进行身份验证。据我了解,本应有一种方法在RMI连接内部进行身份验证,但被否决了。
  3. 不太确定需要做什么或可以做什么。我知道您不能编写自己的客户端并请求连接到服务器,因为您需要ObjectID和远程接口。但是,既然它们已经在RMI中发送,那么不可能反编译您需要的类\接口吗?我在研究时还看到了这个Youtube视频[http://www.youtube.com/watch?v=otjllNaBxiw],让我感到担忧,因为它非常容易,尽管我不知道服务器是否设置正确。

总的来说,在互联网上使用RMI还有其他安全问题需要考虑吗?我是否缺少需要考虑的解决方案?我已经了解的是否错误?


你可以使用应用服务器和应用客户端。它们之间的连接使用RMI-IIOP,您可以利用服务器的安全性。在服务器上,您可以访问EJB以进行数据访问。 - onesixtyfourth
阅读文档后,我认为只有在整个应用程序的某些部分不是用Java编写时才需要RMI-IIOP,而这并不是情况。那么这又如何解决担忧呢? - user1803551
1个回答

4
客户端和服务器之间的信息交换。
通过SSL的RMI。
客户端的身份验证是通过SSL完成的。您可能指的是授权,这相对容易。定义自己的RMIServerSocketFactory,返回一个ServerSocket覆盖其implAccept()方法,将套接字包装在SSLSocket中,并将握手侦听器添加到其中,并在其上设置needClientAuth为true(clientMode为false)。然后,您的握手侦听器应该从SSLSession中获取并检查客户端证书,以查看它所认证的身份是否被授权,如果未经授权,则简单地关闭套接字。
另一方面,在客户端中授权服务器非常复杂。您确实需要Jini中的JERI API来正确执行此操作。
利用正在运行的RMI服务器(黑客等)。
我不会说这是不可能的,但它非常困难,并且有几个强大的防御线。您需要ObjectID,它是随机的,并且可以安全地随机生成,您还需要类。除非您明确启用,否则在RMI中不会发送类和接口,并且它们通过您可以任意强烈地保护的侧通道发送,例如双向身份验证的HTTPS。因此,您无法获得那些。然后,您需要获得自己的授权,这基本上需要破坏服务器。如果那是可能的,那么任何事情都是可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接