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

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

通过RMI安全validation客户端

java rmi身份validation和安全性。 exportObject使它公开?

java rmi中的通信安全吗?

我有3个部分需要考虑:

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

我知道的:

  1. RMI over SSL。 使用SSL套接字而不是默认套接字将加密客户端和服务器之间传递的所有信息。 这包括对象交换和方法调用。
  2. 在建立RMI连接之前使用SSL上的用户名/密码组合进行身份validation。 根据我的理解,应该有一种在RMI连接内部进行身份validation的方法,但它被拒绝了。
  3. 不太确定这里可以或需要做什么。 我知道你不能只编写自己的客户端并要求连接到服务器,因为你需要一个ObjectID和远程接口。 但是,是否无法对您需要的类\接口进行反编译,因为无论如何它们都是在RMI中发送的? 我在研究时也看到了这个Youtubevideo[ http://www.youtube.com/watch?v=otjllNaBxiw]它让我担心它有多容易,虽然我不知道服务器是否设置不正确。

总而言之,我是否需要通过互联网在RMI中考虑其他安全问题? 我错过了一个我需要看的解决方案吗? 我已经知道错了吗?

客户端和服务器之间交换的信息。

RMI over SSL。

客户端身份validation。

客户端的身份validation由SSL完成。 你的意思是授权,这是“相对”容易的。 定义您自己的RMIServerSocketFactory,它返回一个ServerSocket覆盖,其implAccept()方法将套接字包装在SSLSocket中,您向其添加一个握手侦听器并将needClientAuth设置为true(并将clientMode设置为false)。 然后,您的握手侦听器应从SSLSession获取并检查客户端证书,以查看其身份validation的身份是否已获得授权,并在未经授权的情况下关闭套接字。

另一方面在客户端授权服务器是非常复杂的。 你真的需要Jini中的JERI API来正确地完成它。

利用正在运行的RMI服务器(黑客等)。

我不会说这是不可能的,但这是非常困难的,并且有几道强有力的防线。 您需要ObjectID,它是随机的,并且可以安全随机,您需要这些类。 除非您专门启用它们,否则不会在RMI中发送类和接口,并且它们由您可以任意强大保护的辅助通道发送,例如使用经过双向身份validation的HTTPS。 所以你不能得到那些。 然后你需要获得自己的授权,这基本上需要妥协服务器。 如果可能的话,那就是。