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

时间:2014-03-24 14:18:11

标签: java security authentication ssl rmi

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

Secure authentication of client over RMI

java rmi authentication & security. exportObject makes it public?

Is communication in java rmi secure?

我需要考虑3个部分:

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

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

1 个答案:

答案 0 :(得分:3)

  

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

SSL上的RMI。

  

客户端身份验证。

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

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

  

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

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